Как взять несколько строк из одного файла?

akella32

Client
Регистрация
24.04.2013
Сообщения
134
Благодарностей
15
Баллы
18
Приветствую. Пожалуйста подскажите решение по следующему вопросу:
Есть файл тхт, 5к строк, из него нужно взять, ну к примеру 50 строчек, рандомно (не от-до, а рандомно) и положить их в переменную, желательно в одну строку. Можно ли такое осуществить.

Раньше было 50 тхт файлов, брал с каждого по строчке и заносил в отдельную переменную, но есть подозрение, что и попроще имеется метод. Заранее спасибо!
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 270
Благодарностей
9 054
Баллы
113
Приветствую. Пожалуйста подскажите решение по следующему вопросу:
Есть файл тхт, 5к строк, из него нужно взять, ну к примеру 50 строчек, рандомно (не от-до, а рандомно) и положить их в переменную, желательно в одну строку. Можно ли такое осуществить.

Раньше было 50 тхт файлов, брал с каждого по строчке и заносил в отдельную переменную, но есть подозрение, что и попроще имеется метод. Заранее спасибо!
привязать файл к списку, перемешивать и брать подсписок 0-49, и каждыйт раз перед взятием подсписка перемешивать строки исх. файла..
а положить в одну строку можно через объединение подспика в переменную с разделителем {-String.Space-}
 
  • Спасибо
Реакции: akella32

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 449
Благодарностей
5 907
Баллы
113
  • Спасибо
Реакции: akella32

Roman*

Client
Регистрация
25.09.2013
Сообщения
1 657
Благодарностей
656
Баллы
113
Попробуй так
Код:
var str = string.Join("\r\n", project.Lists["какой то список"].Take(50));
return str;
 
  • Спасибо
Реакции: termit, GHU и akella32

one

Client
Регистрация
22.09.2015
Сообщения
6 831
Благодарностей
1 275
Баллы
113

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
А как вместо значения 50 подставить значение из переменной?
C#:
return string.Join("\r\n", project.Lists["какой-то список"].Take(int.Parse(project.Variables["какая-то переменная"].Value)));
но лучше так
C#:
var list = project.Lists["List"];
int i = int.Parse(project.Variables["Var"].Value);
return string.Join("\r\n", list.Take(i));
 
  • Спасибо
Реакции: GHU, one и Roman*

one

Client
Регистрация
22.09.2015
Сообщения
6 831
Благодарностей
1 275
Баллы
113
А как удалить из списка взятые строки?
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
А как удалить из списка взятые строки?
C#:
var list = project.Lists["List"];
int i = int.Parse(project.Variables["Var"].Value);
StringBuilder strb = new StringBuilder();

lock (SyncObjects.ListSyncer)
{
    if (i > list.Count)
        throw new Exception("Недостаточно строк в списке");
    for (int j = 0; j < i; j++)
    {
        if (j == i - 1)
            strb.Append(list[0]);
        else
            strb.Append(list[0] + "\r\n");
        list.RemoveAt(0);
    }
    return strb.ToString();
}
 
  • Спасибо
Реакции: SergSh, GHU и one

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
Можно попросить внести правку что бы последние строки брал не сколько указано (выход по ошибке если не хватает строк) а брал все что осталось?
C#:
var list = project.Lists["List"];
int i = int.Parse(project.Variables["Var"].Value);
StringBuilder strb = new StringBuilder();

lock (SyncObjects.ListSyncer)
{
    for (int j = 0; j < i; j++)
    {
        if (j == i - 1)
            strb.Append(list[0]);
        else
            strb.Append(list[0] + "\r\n");
        list.RemoveAt(0);
        if (list.Count == 0)
            return strb.ToString().Trim();
    }
    return strb.ToString();
}
 
Последнее редактирование:

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Код:
lock (SyncObjects.ListSyncer)
Один написал код для блока элемента и все поголовно копируют. Тут 90% пользователей lock вообще не нужен
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
Код:
lock (SyncObjects.ListSyncer)
Один написал код для блока элемента и все поголовно копируют. Тут 90% пользователей lock вообще не нужен
В данном конкретном случае ничего не измениться, если лочить ТОЛЬКО код, где непосредственно происходит удаление строки из списка.
Не спорю, можно и так:
Код:
lock (SyncObjects.ListSyncer)
    list.RemoveAt(0);
 
  • Спасибо
Реакции: eee

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Оператор lock служит для блокирования участков кода для запрета доступа к ним из других потоков и работает посредством блокирования потоков на уровне ядра и последующим их вызовом. Когда нет других потоков, которые подступаются к данному коду, то оператор lock не нужен. Плюс для блокирования участков кода, содержащих работу с листами/массивами и другими ссылочными объектами лучше всего передавать сам объект блокировки (в данном случае сам лист вместо SyncObjects.ListSyncer)
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 641
Баллы
113
Оператор lock служит для блокирования участков кода для запрета доступа к ним из других потоков и работает посредством блокирования потоков на уровне ядра и последующим их вызовом. Когда нет других потоков, которые подступаются к данному коду, то оператор lock не нужен. Плюс для блокирования участков кода, содержащих работу с листами/массивами и другими ссылочными объектами лучше всего передавать сам объект блокировки (в данном случае сам лист вместо SyncObjects.ListSyncer)
откуда тебе знать, есть ли другие потоки? Даже если их нет, откуда тебе знать, что они не появятся в будущем?
 
  • Спасибо
Реакции: one и Dimionix

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
откуда тебе знать, есть ли другие потоки? Даже если их нет, откуда тебе знать, что они не появятся в будущем?
Так это совсем не значит, что "на всякий случай" надо всегда впихивать лишние участки кода. Если надо, можно потом и добавить, а не добавлять всегда ради того "чтобы было".
А инфу про lock я привел для того, чтобы люди не пихали его в коде необдуманно, а понимали хотя бы что он значит, где используется и стоит ли им его применять в данном случае или нет.
 
  • Спасибо
Реакции: Makswell

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
откуда тебе знать, есть ли другие потоки? Даже если их нет, откуда тебе знать, что они не появятся в будущем?
Я вот тоже нигде не увидел, чтоб кто-то говорил про один поток.
 
  • Спасибо
Реакции: Adigen и one

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Я вот тоже нигде не увидел, чтоб кто-то говорил про один поток.
Да больше мне не нравится то, что люди копируют код, даже не понимая, что в-основном 90+% пользователей им не нужен этот оператор. Ладно ты понимаешь, но когда приводишь пример, хотя бы приводи его без lock, чтобы эта повсеместная тенденция на lock не была болезнью форума.
Или хотя бы коммент приписать можно, типа "закомментируйте строку если будете использовать в одном потоке".
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 641
Баллы
113
Да больше мне не нравится то, что люди копируют код, даже не понимая, что в-основном 90+% пользователей им не нужен этот оператор. Ладно ты понимаешь, но когда приводишь пример, хотя бы приводи его без lock, чтобы эта повсеместная тенденция на lock не была болезнью форума.
правильно. приведи его без лок, чтобы новый счастливый обладатель этого кода быстренько его себе ставил, быстренько потерял нужную инфу, быстренько вернулся на форум с предъявами.
Лучше прийти раньше, чем опоздать
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
правильно. приведи его без лок, чтобы новый счастливый обладатель этого кода быстренько его себе ставил, быстренько потерял нужную инфу, быстренько вернулся на форум с предъявами.
Лучше прийти раньше, чем опоздать
Для этого можно закомментировать строку и приписать комментарий-пояснение.
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
Да больше мне не нравится то, что люди копируют код, даже не понимая, что в-основном 90+% пользователей им не нужен этот оператор. Ладно ты понимаешь, но когда приводишь пример, хотя бы приводи его без lock, чтобы эта повсеместная тенденция на lock не была болезнью форума.
Так же эти 90+% пользователей просят готовый сниппет, который будет работать независимо от количества потоков безо всяких допиливаний. Никто не объясняет во сколько потоков у него будет проходить работа, т.к. ZP в большинстве случаев - это многопоточный инструмент.
Для этого можно закомментировать строку и приписать комментарий-пояснение.
Вряд ли в стандартных кубиках такая организация.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 641
Баллы
113
Для этого можно закомментировать строку и приписать комментарий-пояснение.
а лучше, написать человеку в приват. Разузнать зачем ему код, пробить остальные подробности и накидать ему шаблончик. Зачем ограничиваться сниппетом
 

one

Client
Регистрация
22.09.2015
Сообщения
6 831
Благодарностей
1 275
Баллы
113
а лучше, написать человеку в приват. Разузнать зачем ему код, пробить остальные подробности и накидать ему шаблончик. Зачем ограничиваться сниппетом
И описать каждую строчку кода. что к чему и зачем.
 
  • Спасибо
Реакции: doc

one

Client
Регистрация
22.09.2015
Сообщения
6 831
Благодарностей
1 275
Баллы
113
C#:
return string.Join("\r\n", project.Lists["какой-то список"].Take(int.Parse(project.Variables["какая-то переменная"].Value)));
но лучше так
C#:
var list = project.Lists["List"];
int i = int.Parse(project.Variables["Var"].Value);
return string.Join("\r\n", list.Take(i));
Этот снипет не видит что файл пустой, продолжает с ним работать бесконечно.
 

ikibostus

Client
Регистрация
27.09.2015
Сообщения
255
Благодарностей
26
Баллы
28
Попробуй так
Код:
var str = string.Join("\r\n", project.Lists["какой то список"].Take(50));
return str;
А как можно полученный результат положить в файл или список? И возможно ли кодом создать txt файл под каждый новый список?
 

one

Client
Регистрация
22.09.2015
Сообщения
6 831
Благодарностей
1 275
Баллы
113
Из снипета в переменную из переменной куда угодно, экшены Данные-Обработка текста и Данные-Файлы.
 
  • Спасибо
Реакции: ikibostus

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Так это совсем не значит, что "на всякий случай" надо всегда впихивать лишние участки кода. Если надо, можно потом и добавить, а не добавлять всегда ради того "чтобы было".
А инфу про lock я привел для того, чтобы люди не пихали его в коде необдуманно, а понимали хотя бы что он значит, где используется и стоит ли им его применять в данном случае или нет.
На всякий случай, надо, по возможности, писать код, который будет правильно работать как при однопоточном, так и при многопоточном выполнении, это правила хорошего тона.

А если у честь что ZP организация потоков имеет свои ньюансы, то надо использовать или объекты блокировки которые предоставляет ZP, или подключать свою длл с такими объектами, для того чтобы расширить их количество, т.к. у инстансов своя копия объекта, и если воспользоваться вашим советом
amyboose сказал(а):
Плюс для блокирования участков кода, содержащих работу с листами/массивами и другими ссылочными объектами лучше всего передавать сам объект блокировки (в данном случае сам лист вместо SyncObjects.ListSyncer)
то в многопотоке вы будете много удивляться.

P.S. У Вас как наберется кода, хотя-бы, тысяч на 20 строк, будет интересно посмотреть как вы будете в нем добавлять убирать "лишние" участки кода

P.P.S. И я не понимаю, вы везде всех критикуете, но ничего сами не предлагаете, может хватит уже ?
Или вам надо постов набрать побольше что-бы солиднее выглядеть ?
 
Последнее редактирование:

maks_pays

Client
Регистрация
01.01.2017
Сообщения
186
Благодарностей
50
Баллы
28

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
  • Спасибо
Реакции: NICOLAS Christophe

Roman*

Client
Регистрация
25.09.2013
Сообщения
1 657
Благодарностей
656
Баллы
113
Как сделать чтоб взятые строки были через запятую и в одну строку?
Может этот переделать
Код:
var list = project.Lists["uids"]; // Исходный список
            Random rand = new Random();
            StringBuilder strb = new StringBuilder();
            // j - количество строк, которое нужно взять.
            int j = 100;
            for (int i = 0; i < j; i++)
            {
                int r = rand.Next(list.Count);
                if (i + 1 == j)
                {
                    strb.Append(list[r]);
                }
                else
                {
                    strb.Append(list[r] + ","); // Разделитель
                }
                list.RemoveAt(r);
                if (list.Count == 0)
                {
                    return strb.ToString();
                }
            }
            return strb.ToString();
 
  • Спасибо
Реакции: Sho и Valerevic

maks_pays

Client
Регистрация
01.01.2017
Сообщения
186
Благодарностей
50
Баллы
28
Может этот переделать
Код:
var list = project.Lists["uids"]; // Исходный список
            Random rand = new Random();
            StringBuilder strb = new StringBuilder();
            // j - количество строк, которое нужно взять.
            int j = 100;
            for (int i = 0; i < j; i++)
            {
                int r = rand.Next(list.Count);
                if (i + 1 == j)
                {
                    strb.Append(list[r]);
                }
                else
                {
                    strb.Append(list[r] + ","); // Разделитель
                }
                list.RemoveAt(r);
                if (list.Count == 0)
                {
                    return strb.ToString();
                }
            }
            return strb.ToString();


мне подходит и такой с# var list = project.Lists["Список 1"].ToList();
list.Shuffle();
return string.Join(",", list.Take(10).ToArray());

но мне нужно чтоб еще указывалось название переменной куда нужно отправить результат.. как такое воплотить?
 

maks_pays

Client
Регистрация
01.01.2017
Сообщения
186
Благодарностей
50
Баллы
28
Может этот переделать
Код:
var list = project.Lists["uids"]; // Исходный список
            Random rand = new Random();
            StringBuilder strb = new StringBuilder();
            // j - количество строк, которое нужно взять.
            int j = 100;
            for (int i = 0; i < j; i++)
            {
                int r = rand.Next(list.Count);
                if (i + 1 == j)
                {
                    strb.Append(list[r]);
                }
                else
                {
                    strb.Append(list[r] + ","); // Разделитель
                }
                list.RemoveAt(r);
                if (list.Count == 0)
                {
                    return strb.ToString();
                }
            }
            return strb.ToString();
Есть возможность сделать так чтобы в одном C# данный код одновременно брал несколько строк и отправлял в переменную aaa1 и тутже брал еще столько же других строк с того же списка и отправлял в переменную ааа2
?
 

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)