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

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 099
Баллы
113
Есть возможность сделать так чтобы в одном C# данный код одновременно брал несколько строк и отправлял в переменную aaa1 и тутже брал еще столько же других строк с того же списка и отправлял в переменную ааа2
?
C#:
var list = project.Lists["List"];
Random rnd = new Random();
StringBuilder strb = new StringBuilder();
int j = 100;
for (int k = 0; k < 2; k++) {
    for (int i = 0; i < j; i++) {
        int r = rnd.Next(list.Count);
        if ((i + 1 == j) || (list.Count == 1))
            strb.Append(list[r]);
        else
            strb.Append(list[r] + ",");
        list.RemoveAt(r);
        if (list.Count == 0) break;
    }
    if (k == 0) {
        project.Variables["aaa1"].Value = strb.ToString();
        strb.Clear();
    }
}
return strb.ToString();
 

maks_pays

Client
Регистрация
01.01.2017
Сообщения
178
Благодарностей
50
Баллы
28
C#:
var list = project.Lists["List"];
Random rnd = new Random();
StringBuilder strb = new StringBuilder();
int j = 100;
for (int k = 0; k < 2; k++) {
    for (int i = 0; i < j; i++) {
        int r = rnd.Next(list.Count);
        if ((i + 1 == j) || (list.Count == 1))
            strb.Append(list[r]);
        else
            strb.Append(list[r] + ",");
        list.RemoveAt(r);
        if (list.Count == 0) break;
    }
    if (k == 0) {
        project.Variables["aaa1"].Value = strb.ToString();
        strb.Clear();
    }
}
return strb.ToString();
Не спорю - удаляет! но переменная одна ааа1 а где ааа2? Такой вариант мне давали (похожий)
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 099
Баллы
113

maks_pays

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

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 099
Баллы
113
я так понимаю. что не важно помочь с вашей стороны - как цель просто что-то ответить или отправить ссылку)))
Заменить строку

return strb.ToString();
на
project.Variables["aaa2"].Value = strb.ToString();

или выбрать свою переменную "aaa2" в поле "Положить результат в переменную", при этом галочку у чекбокса "Не возвращать значение" ставить НЕ нужно.

Не могу понять, в чем сложность?
 
  • Спасибо
Реакции: ks1989

z@jivalo

Client
Регистрация
27.12.2016
Сообщения
798
Благодарностей
178
Баллы
43
попробовал использовать снипет что бы вытащить строки из файла
пишет ошибку

Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index


Хочу вытащить 100 строк
в файле 5 млн строк

Так понимаю не хочет зенка этот файл?
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 713
Благодарностей
1 370
Баллы
113
вот такая конструкция вытащит 100 первых строк из списка и удалит их оттуда ... результат будет в виде строки разделенной запятыми
Код:
string myvar = string.Join(",",project.Lists["mylist"].GetItems("0-99",true).ToList());
если нужны случайные строки, то так
Код:
string myvar = string.Join(",",project.Lists["mylist"].GetItems("random100(0-end)",true).ToList());
p.s работать будет начиная с ZP 5.10.0.0
 
Последнее редактирование:

z@jivalo

Client
Регистрация
27.12.2016
Сообщения
798
Благодарностей
178
Баллы
43
а мне надо 500 000 строк разом в файл
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 713
Благодарностей
1 370
Баллы
113
var portion = project.Lists["mylist"].GetItems("random500000(0-end)",true).ToList();

в результате у вас возьмется 500000 случайных строк из списка mylist с удалением... результат будет в списке portion ...

Если хотите записать эти 500000 строк из списка portion в какой-то другой список, например привязанный к файлу, то project.Lists["myotherlist"].AddRange(portion);
 

z@jivalo

Client
Регистрация
27.12.2016
Сообщения
798
Благодарностей
178
Баллы
43
попробую ваш вариант, но что-то я уже столько перепробовал не хочет дружить нормально

UPD: ваш код работает но процедура оч долгая к тому же я указал 50к строк не так уж и много а делает уже 5 мин почти

Очень долго пришлось PM процесс вырубить зависло
 
Последнее редактирование:

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 713
Благодарностей
1 370
Баллы
113

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 713
Благодарностей
1 370
Баллы
113
и вот так попробуйте, думаю еще быстрее будет

Код:
project.Lists["mylist"].Shuffle();
var portion = project.Lists["portion"];
while(1==1){
    if ( portion.Count == 50000 || project.Lists["mylist"].Count == 0 )
    break;
    portion.Add(project.Lists["mylist"][0]);
    project.Lists["mylist"].RemoveAt(0);
}
в результате возьмутся (с удалением) 50000 случайных строк из списка mylist и будут положены в список portion
 
  • Спасибо
Реакции: Anfim777

z@jivalo

Client
Регистрация
27.12.2016
Сообщения
798
Благодарностей
178
Баллы
43
и вот так попробуйте, думаю еще быстрее будет
Увы тоже долго,

вот нашел снипет

Код:
string path = project.Directory+@"\\proxy\\proxy.txt"; // путь к файлу
string numberOfLine = "0-50000";
string[] tmp = FileSystem.FileGetLines(path, numberOfLine, true, false);
File.WriteAllLines(project.Directory+@"\\proxy\\tmp.txt",tmp);
Он быстрее работает но после прохода он удаляет то что ранее скопировал.

Как сделать так что бы дописывал? И тогда решение подойдет
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 713
Благодарностей
1 370
Баллы
113

z@jivalo

Client
Регистрация
27.12.2016
Сообщения
798
Благодарностей
178
Баллы
43
Оба списка были привязаны к файлам?
да оба привязаны.
И все равно что-то не то получается я накрутил тут с этими кубиками.
Вроде простое задание а реализовать толком не получается

P.S. помимо того что надо разбивать файл так его надо еще и создавать уникальный.
пример:
proxy-1.txt в каждом по 50-100к строк
proxy-2.txt в каждом по 50-100к строк
proxy-3.txt в каждом по 50-100к строк
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 713
Благодарностей
1 370
Баллы
113
Нужно завести счетчик и каждый раз когда берете очередные 50к строк из файла увеличивать его ... а при записи файла использовать его для составления имени файла

File.WriteAllLines(project.Directory+"\\proxy-"+project.Variables["counter"].Value+".txt",tmp);
 

z@jivalo

Client
Регистрация
27.12.2016
Сообщения
798
Благодарностей
178
Баллы
43
ужно завести счетчик и каждый раз когда берете очередные 50к строк из файла увеличивать его ... а при записи файла использовать его для составления имени файла

File.WriteAllLines(project.Directory+"\\proxy-"+project.Variables["counter"].Value+".txt",tmp);
Хотел все это в одно кубике сделать, а не городить дополнительными кубиками.

Так как я не силен в шарпе то и приходится куски с форума собирать и тестировать их
 

Valerevic

Client
Регистрация
24.11.2017
Сообщения
55
Благодарностей
17
Баллы
8
Может этот переделать
Код:
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();
Подскажите, как изменить код, чтобы строки брались без удаления?
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 361
Благодарностей
8 646
Баллы
113
  • Спасибо
Реакции: Valerevic

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 683
Баллы
113

Valerevic

Client
Регистрация
24.11.2017
Сообщения
55
Благодарностей
17
Баллы
8

kagorec

Client
Регистрация
24.08.2013
Сообщения
916
Благодарностей
471
Баллы
63
Подскажите снипет:
Взять из списка 5 строк, если меньше чем 5 строк то взять те что остались, в переменную в одну строку через разделитель запятая
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 361
Благодарностей
8 646
Баллы
113
Подскажите снипет:
Взять из списка 5 строк, если меньше чем 5 строк то взять те что остались, в переменную в одну строку через разделитель запятая
Возможно, вот тут есть что то близкое:
 
  • Спасибо
Реакции: kagorec

ильяsffse

Client
Регистрация
23.06.2018
Сообщения
113
Благодарностей
50
Баллы
28
Подскажите пж :bh: КАК добавить еще 1 перменную ??? Что бы в нее брались рандомные строки из списка..

При добавлении 3ей переменной "project.Variables["Opisanie3"].Value = strb.ToString();[/CODE]" Строки берутся идентичные первой:bh:

Только 2 отрабатывают как надо...

C#:
var list = project.Lists["hashteg"];
Random rnd = new Random();
StringBuilder strb = new StringBuilder();
int j = 100;
for (int k = 0; k < 2; k++) {
    for (int i = 0; i < j; i++) {
        int r = rnd.Next(list.Count);
        if ((i + 1 == j) || (list.Count == 1))
            strb.Append(list[r]);
        else
            strb.Append(list[r] + ",");
       // list.RemoveAt(r);
        if (list.Count == 0) break;
    }
    if (k == 0) {
        project.Variables["Opisanie1"].Value = strb.ToString();
        strb.Clear();
    }
}
project.Variables["Opisanie2"].Value = strb.ToString();
:bh:Вот в этой project.Variables["Opisanie3"].Value = strb.ToString();[/CODE] Беруться такие же как project.Variables["Opisanie1"].Value = strb.ToString();
 
  • Спасибо
Реакции: djaga

djaga

Client
Регистрация
26.04.2020
Сообщения
505
Благодарностей
1 050
Баллы
93
Подскажите пж :bh: КАК добавить еще 1 перменную ??? Что бы в нее брались рандомные строки из списка..

При добавлении 3ей переменной "project.Variables["Opisanie3"].Value = strb.ToString();[/CODE]" Строки берутся идентичные первой:bh:

Только 2 отрабатывают как надо...

C#:
var list = project.Lists["hashteg"];
Random rnd = new Random();
StringBuilder strb = new StringBuilder();
int j = 100;
for (int k = 0; k < 2; k++) {
    for (int i = 0; i < j; i++) {
        int r = rnd.Next(list.Count);
        if ((i + 1 == j) || (list.Count == 1))
            strb.Append(list[r]);
        else
            strb.Append(list[r] + ",");
       // list.RemoveAt(r);
        if (list.Count == 0) break;
    }
    if (k == 0) {
        project.Variables["Opisanie1"].Value = strb.ToString();
        strb.Clear();
    }
}
project.Variables["Opisanie2"].Value = strb.ToString();
:bh:Вот в этой project.Variables["Opisanie3"].Value = strb.ToString();[/CODE] Беруться такие же как project.Variables["Opisanie1"].Value = strb.ToString();
Привет)
Если я правильно понял задачку, то можно вот так:

Взять рандомные строчки равные количеству результирующих переменных с удалением из списка:
var lines = project.Lists["listLines"];
var random = new Random((int) DateTime.Now.Ticks & (0x0000FFFF + lines.Count));
var variables = new List<ILocalVariable>() { // Здесь указывать переменные из ZM
    project.Variables["Variable1"],
    project.Variables["Variable2"],
    project.Variables["Variable3"],
};

foreach (var variable in variables)
{
    int i = random.Next(lines.Count);
    string line = lines[i];
    lines.RemoveAt(i); // если нужно без удаления, удалить строчку
    variable.Value = line;
}
Ниже приложил шаблон для примера ↓
 

Вложения

ильяsffse

Client
Регистрация
23.06.2018
Сообщения
113
Благодарностей
50
Баллы
28
Привет)
Если я правильно понял задачку, то можно вот так:

Взять рандомные строчки равные количеству результирующих переменных с удалением из списка:
var lines = project.Lists["listLines"];
var random = new Random((int) DateTime.Now.Ticks & (0x0000FFFF + lines.Count));
var variables = new List<ILocalVariable>() { // Здесь указывать переменные из ZM
    project.Variables["Variable1"],
    project.Variables["Variable2"],
    project.Variables["Variable3"],
};

foreach (var variable in variables)
{
    int i = random.Next(lines.Count);
    string line = lines[i];
    lines.RemoveAt(i); // если нужно без удаления, удалить строчку
    variable.Value = line;
}
Ниже приложил шаблон для примера ↓
Спасибо.
Задача была брать из списка, например по 50 рандомных строк...в каждую переменную, в 2 переменные бралось. А вот как добавить 3ю переменную.
 
  • Спасибо
Реакции: d4k и lapa666

djaga

Client
Регистрация
26.04.2020
Сообщения
505
Благодарностей
1 050
Баллы
93
Задача была брать из списка, например по 50 рандомных строк...в каждую переменную
Для начала, вы не указали, эту подробность в своем вопросе выше. Но это не проблема.


Задача была брать из списка, например по 50 рандомных строк...в каждую переменную
Решение:
Взять рандомное n количество строчек записывая в указанные переменные, с удалением из списка:
int howManyRows = 5; // сколько строчек нужно в одной переменной
var lines = project.Lists["listLines"];
var random = new Random((int) DateTime.Now.Ticks & (0x0000FFFF + lines.Count));
var variables = new List<ILocalVariable>() { // Здесь указывать переменные из ZM
    project.Variables["Variable1"],
    project.Variables["Variable2"],
    project.Variables["Variable3"],
};

List<string> tempList = new List<string>();
foreach (var variable in variables)
{
    for (int j = 0; j < howManyRows; j++)
    {
        int i = random.Next(lines.Count);
        tempList.Add(lines[i]);
        lines.RemoveAt(i); // если нужно без удаления, удалить строчку
    }
    variable.Value = string.Join("\r\n", tempList); // разделитель с новой строки
    tempList.Clear();
}
Спасибо в карман не положишь, нажмите на кнопку "спасибо". ;-) Под прошлым ответом, в этом случае и в будущем. Я все же старался для вас.

Проект приложил ниже ↓.
 

Вложения

  • Спасибо
Реакции: Sho, d4k и ильяsffse

ильяsffse

Client
Регистрация
23.06.2018
Сообщения
113
Благодарностей
50
Баллы
28
Для начала, вы не указали, эту подробность в своем вопросе выше. Но это не проблема.



Решение:
Взять рандомное n количество строчек записывая в указанные переменные, с удалением из списка:
int howManyRows = 5; // сколько строчек нужно в одной переменной
var lines = project.Lists["listLines"];
var random = new Random((int) DateTime.Now.Ticks & (0x0000FFFF + lines.Count));
var variables = new List<ILocalVariable>() { // Здесь указывать переменные из ZM
    project.Variables["Variable1"],
    project.Variables["Variable2"],
    project.Variables["Variable3"],
};

List<string> tempList = new List<string>();
foreach (var variable in variables)
{
    for (int j = 0; j < howManyRows; j++)
    {
        int i = random.Next(lines.Count);
        tempList.Add(lines[i]);
        lines.RemoveAt(i); // если нужно без удаления, удалить строчку
    }
    variable.Value = string.Join("\r\n", tempList); // разделитель с новой строки
    tempList.Clear();
}

Спасибо в карман не положишь, нажмите на кнопку "спасибо". ;-) Под прошлым ответом, в этом случае и в будущем. Я все же старался для вас.

Проект приложил ниже ↓.
ОГРОМНОЕ спасибо:bt::bu:
 
  • Спасибо
Реакции: djaga

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