C# - разбить файл на мелкие, по определенному разделителю в тексте.

LightWood

Moderator
Регистрация
04.11.2010
Сообщения
2 382
Благодарностей
917
Баллы
113
Есть файл. Большой. Задача разбить его на мелкие, но по определенному разделителю.

Код:
a
b
c
11111
d
e
f
11111
g
h
i
11111
j
k
l
где 11111 - это разделитель. Разделитель либо оставлять в файлах, либо нет, это не принципиально, но лучше оставлять.
Файлы выходные должны нумероваться попорядку. 0.txt, 1.txt, 2.txt и т.д., чтобы я мог их также попорядку также обработать.

Хелп, гуру СИшарпа.
Подсобите работающим кодом.
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
Индусский код
C#:
var list = project.Lists["Список"];

var buffList = new List<string>();
var index =0;
var splitValue = "6666";
for (int i=0; i<list.Count(); i++)
{
    if (list[i]!="6666"){
         buffList.add(list[i])
          }
      else{
          File.WriteAllLines(index+".txt",buffList);
         index++;
           buffList.clear();
     }
}
 
  • Спасибо
Реакции: CSS и LightWood

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
Ну или норм вариант
C#:
var list = new List<string>(){"1","2","666","3","4"};

            var rez = SplitBy(list,"666");
            for (int i = 0; i < rez.Count; i++)
            {
               File.WriteAllLines(i+".txt",rez[i]);
            }

static List<List<string>> SplitBy(List<string> source, string separator)
        {
            int c = 0;
            return
                source.GroupBy(val => (val == separator) ? ++c : c)
                .Select(g => (g.Key == 0 ? g : g.Skip(1)).ToList()).ToList();
        }
 
  • Спасибо
Реакции: CSS и LightWood

Nick

Client
Регистрация
22.07.2014
Сообщения
1 983
Благодарностей
817
Баллы
113
Первый вариант вполне норм, зачем вы так))
 
  • Спасибо
Реакции: Radzhab

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
Если бы не я, то Лекс сделал бы это)_
 
  • Спасибо
Реакции: CSS

LightWood

Moderator
Регистрация
04.11.2010
Сообщения
2 382
Благодарностей
917
Баллы
113

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
buffList.add(list); точку с запятой поставь
 

LightWood

Moderator
Регистрация
04.11.2010
Сообщения
2 382
Благодарностей
917
Баллы
113

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
Add, Clear замени
 
  • Спасибо
Реакции: LightWood

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
полностью код выложи
 

LightWood

Moderator
Регистрация
04.11.2010
Сообщения
2 382
Благодарностей
917
Баллы
113
Поправил. Сейчас выглядит так:
Код:
var list = project.Lists["abc"];
var buffList = new List<string>();
var index =0;
var splitValue = "6666";
for (int i=0; i<list.Count(); i++)
{
    if (list[i]!="6666"){
         buffList.Add(list[i]);
          }
      else{
          File.WriteAllLines(index+".txt",buffList);
         index++;
           buffList.Clear();
     }
}
Выполнился успешно, но выходных файлов не вижу.
Либо их нет, либо где они?
 

LightWood

Moderator
Регистрация
04.11.2010
Сообщения
2 382
Благодарностей
917
Баллы
113
Кроме названия списка ничего не менял в коде.
Разделитель в файле 6666. Список привязан.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
:D Radzhab наверно их засекретил))
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
Они в папке Zennoposter.

File.WriteAllLines(@"D:\123\"+index+".txt",buffList);
 
  • Спасибо
Реакции: LightWood

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
или, чтоб файл создавался в директории проекта:
File.WriteAllLines(project.Directory+"\"+index+".txt",buffList);
 
  • Спасибо
Реакции: LightWood

7make

Client
Регистрация
25.06.2011
Сообщения
1 547
Благодарностей
1 311
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с 7make какие-либо сделки.

за что обделили стоковый сплит=/?
C#:
//input data
string data = File.ReadAllText(project.Directory + "data.txt");

string separator = "11111";

string[] text = data.Split(new string[] { separator }, StringSplitOptions.RemoveEmptyEntries);

for (int i = 0; i < text.Length; i++)
   {
      File.WriteAllText(project.Directory + i + ".txt", text[I].Trim());
   }
 
Последнее редактирование:
  • Спасибо
Реакции: LightWood и CSS

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
рассекретили)))
 

LightWood

Moderator
Регистрация
04.11.2010
Сообщения
2 382
Благодарностей
917
Баллы
113
Спасибо, парни. Выручили.
В кодах есть ошибки, то на регистр ругается, кое-где не хватает обратных слешей чтобы файл корректно подхватывался и т.д.
Разобрался и поправил. Вот 2 рабочих варианта. Сохраняет файлы в директорию шаба:
Раз:
Код:
var list = project.Lists["Список"];
var buffList = new List<string>();
var index =0;
var splitValue = "6666";
for (int i=0; i<list.Count(); i++)
{
    if (list[i]!="6666"){
         buffList.Add(list[i]);
          }
      else{
           File.WriteAllLines(@project.Directory+"\\"+index+".txt",buffList);
         index++;
           buffList.Clear();
     }
}
Два:
Код:
//input data
string data = File.ReadAllText(project.Directory+"\\"+ "data.txt");
string separator = "11111";
string[] text = data.Split(new string[] { separator }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < text.Length; i++)
   {
      File.WriteAllText(project.Directory+"\\"+ i + ".txt", text[i].Trim());
   }
 

mrfeathers

Новичок
Регистрация
07.11.2015
Сообщения
14
Благодарностей
0
Баллы
1
Народ, не подскажите почему не срабатывает код:

 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
Делайте не в тестере, а в блоке C# В проекте. Тестер не подхватывает Using
 
  • Спасибо
Реакции: mrfeathers

kapelan28

Client
Регистрация
22.09.2015
Сообщения
469
Благодарностей
186
Баллы
43
Подскажите, а можно разбить файл (порядка 6 ГБ) на более мелкие по количеству строк (к примеру, по 100 000 строк на каждый файл) с порядковым нумерованием (брать исходное название и добавлять порядковый номер)?
 
  • Спасибо
Реакции: Radzhab

LightWood

Moderator
Регистрация
04.11.2010
Сообщения
2 382
Благодарностей
917
Баллы
113
Подскажите, а можно разбить файл (порядка 6 ГБ) на более мелкие по количеству строк (к примеру, по 100 000 строк на каждый файл) с порядковым нумерованием (брать исходное название и добавлять порядковый номер)?
Так-то можно конечно. Даже стандартными кубиками можно сделать, но через сишарп есть явно какие-то максимально подходящие методы, чтобы всё шустренько обработалось.
Те кто шарит, подскажет думаю вскоре.
 

kapelan28

Client
Регистрация
22.09.2015
Сообщения
469
Благодарностей
186
Баллы
43
Так-то можно конечно. Даже стандартными кубиками можно сделать, но через сишарп есть явно какие-то максимально подходящие методы, чтобы всё шустренько обработалось.
Те кто шарит, подскажет думаю вскоре.
да уже нашел решение - поправил шаблон, чтобы изначально дубли строк не создавал при работе, файл очень уменьшился :-). Только учусь, так что ошибки неизбежны.
 

LightWood

Moderator
Регистрация
04.11.2010
Сообщения
2 382
Благодарностей
917
Баллы
113
да уже нашел решение - поправил шаблон, чтобы изначально дубли строк не создавал при работе, файл очень уменьшился :-). Только учусь, так что ошибки неизбежны.
Гуд :-)
 

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