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

  • Автор темы Автор темы akella32
  • Дата начала Дата начала

akella32

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

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

Раньше было 50 тхт файлов, брал с каждого по строчке и заносил в отдельную переменную, но есть подозрение, что и попроще имеется метод. Заранее спасибо!
привязать файл к списку, перемешивать и брать подсписок 0-49, и каждыйт раз перед взятием подсписка перемешивать строки исх. файла..
а положить в одну строку можно через объединение подспика в переменную с разделителем {-String.Space-}
 
  • Спасибо
Реакции: akella32
Попробуй так
Код:
Развернуть Свернуть Копировать
var str = string.Join("\r\n", project.Lists["какой то список"].Take(50));
return str;
 
  • Спасибо
Реакции: termit, GHU и akella32
Попробуй так
Код:
Развернуть Свернуть Копировать
var str = string.Join("\r\n", project.Lists["какой то список"].Take(50));
return str;
А как вместо значения 50 подставить значение из переменной?
 
А как вместо значения 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*
А как удалить из списка взятые строки?
 
А как удалить из списка взятые строки?
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
Можно попросить внести правку что бы последние строки брал не сколько указано (выход по ошибке если не хватает строк) а брал все что осталось?
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();
}
 
Последнее редактирование:
Код:
Развернуть Свернуть Копировать
lock (SyncObjects.ListSyncer)
Один написал код для блока элемента и все поголовно копируют. Тут 90% пользователей lock вообще не нужен
 
Код:
Развернуть Свернуть Копировать
lock (SyncObjects.ListSyncer)
Один написал код для блока элемента и все поголовно копируют. Тут 90% пользователей lock вообще не нужен
В данном конкретном случае ничего не измениться, если лочить ТОЛЬКО код, где непосредственно происходит удаление строки из списка.
Не спорю, можно и так:
Код:
Развернуть Свернуть Копировать
lock (SyncObjects.ListSyncer)
    list.RemoveAt(0);
 
  • Спасибо
Реакции: eee
Оператор lock служит для блокирования участков кода для запрета доступа к ним из других потоков и работает посредством блокирования потоков на уровне ядра и последующим их вызовом. Когда нет других потоков, которые подступаются к данному коду, то оператор lock не нужен. Плюс для блокирования участков кода, содержащих работу с листами/массивами и другими ссылочными объектами лучше всего передавать сам объект блокировки (в данном случае сам лист вместо SyncObjects.ListSyncer)
 
Оператор lock служит для блокирования участков кода для запрета доступа к ним из других потоков и работает посредством блокирования потоков на уровне ядра и последующим их вызовом. Когда нет других потоков, которые подступаются к данному коду, то оператор lock не нужен. Плюс для блокирования участков кода, содержащих работу с листами/массивами и другими ссылочными объектами лучше всего передавать сам объект блокировки (в данном случае сам лист вместо SyncObjects.ListSyncer)
откуда тебе знать, есть ли другие потоки? Даже если их нет, откуда тебе знать, что они не появятся в будущем?
 
  • Спасибо
Реакции: one и Dimionix
откуда тебе знать, есть ли другие потоки? Даже если их нет, откуда тебе знать, что они не появятся в будущем?
Так это совсем не значит, что "на всякий случай" надо всегда впихивать лишние участки кода. Если надо, можно потом и добавить, а не добавлять всегда ради того "чтобы было".
А инфу про lock я привел для того, чтобы люди не пихали его в коде необдуманно, а понимали хотя бы что он значит, где используется и стоит ли им его применять в данном случае или нет.
 
  • Спасибо
Реакции: Makswell
откуда тебе знать, есть ли другие потоки? Даже если их нет, откуда тебе знать, что они не появятся в будущем?
Я вот тоже нигде не увидел, чтоб кто-то говорил про один поток.
 
  • Спасибо
Реакции: Adigen и one
Я вот тоже нигде не увидел, чтоб кто-то говорил про один поток.
Да больше мне не нравится то, что люди копируют код, даже не понимая, что в-основном 90+% пользователей им не нужен этот оператор. Ладно ты понимаешь, но когда приводишь пример, хотя бы приводи его без lock, чтобы эта повсеместная тенденция на lock не была болезнью форума.
Или хотя бы коммент приписать можно, типа "закомментируйте строку если будете использовать в одном потоке".
 
Да больше мне не нравится то, что люди копируют код, даже не понимая, что в-основном 90+% пользователей им не нужен этот оператор. Ладно ты понимаешь, но когда приводишь пример, хотя бы приводи его без lock, чтобы эта повсеместная тенденция на lock не была болезнью форума.
правильно. приведи его без лок, чтобы новый счастливый обладатель этого кода быстренько его себе ставил, быстренько потерял нужную инфу, быстренько вернулся на форум с предъявами.
Лучше прийти раньше, чем опоздать
 
правильно. приведи его без лок, чтобы новый счастливый обладатель этого кода быстренько его себе ставил, быстренько потерял нужную инфу, быстренько вернулся на форум с предъявами.
Лучше прийти раньше, чем опоздать
Для этого можно закомментировать строку и приписать комментарий-пояснение.
 
Да больше мне не нравится то, что люди копируют код, даже не понимая, что в-основном 90+% пользователей им не нужен этот оператор. Ладно ты понимаешь, но когда приводишь пример, хотя бы приводи его без lock, чтобы эта повсеместная тенденция на lock не была болезнью форума.
Так же эти 90+% пользователей просят готовый сниппет, который будет работать независимо от количества потоков безо всяких допиливаний. Никто не объясняет во сколько потоков у него будет проходить работа, т.к. ZP в большинстве случаев - это многопоточный инструмент.
Для этого можно закомментировать строку и приписать комментарий-пояснение.
Вряд ли в стандартных кубиках такая организация.
 
Для этого можно закомментировать строку и приписать комментарий-пояснение.
а лучше, написать человеку в приват. Разузнать зачем ему код, пробить остальные подробности и накидать ему шаблончик. Зачем ограничиваться сниппетом
 
а лучше, написать человеку в приват. Разузнать зачем ему код, пробить остальные подробности и накидать ему шаблончик. Зачем ограничиваться сниппетом
И описать каждую строчку кода. что к чему и зачем.
 
  • Спасибо
Реакции: doc
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));
Этот снипет не видит что файл пустой, продолжает с ним работать бесконечно.
 
Попробуй так
Код:
Развернуть Свернуть Копировать
var str = string.Join("\r\n", project.Lists["какой то список"].Take(50));
return str;
А как можно полученный результат положить в файл или список? И возможно ли кодом создать txt файл под каждый новый список?
 
Из снипета в переменную из переменной куда угодно, экшены Данные-Обработка текста и Данные-Файлы.
 
  • Спасибо
Реакции: ikibostus
Так это совсем не значит, что "на всякий случай" надо всегда впихивать лишние участки кода. Если надо, можно потом и добавить, а не добавлять всегда ради того "чтобы было".
А инфу про lock я привел для того, чтобы люди не пихали его в коде необдуманно, а понимали хотя бы что он значит, где используется и стоит ли им его применять в данном случае или нет.

На всякий случай, надо, по возможности, писать код, который будет правильно работать как при однопоточном, так и при многопоточном выполнении, это правила хорошего тона.

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

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

P.P.S. И я не понимаю, вы везде всех критикуете, но ничего сами не предлагаете, может хватит уже ?
Или вам надо постов набрать побольше что-бы солиднее выглядеть ?
 
Последнее редактирование:
Попробуй так
Код:
Развернуть Свернуть Копировать
var str = string.Join("\r\n", project.Lists["какой то список"].Take(50));
return str;

Как сделать чтоб взятые строки были через запятую и в одну строку?
 
  • Спасибо
Реакции: NICOLAS Christophe
Как сделать чтоб взятые строки были через запятую и в одну строку?
Может этот переделать
Код:
Развернуть Свернуть Копировать
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
Может этот переделать
Код:
Развернуть Свернуть Копировать
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());

но мне нужно чтоб еще указывалось название переменной куда нужно отправить результат.. как такое воплотить?
 
Может этот переделать
Код:
Развернуть Свернуть Копировать
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
?
 

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