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

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

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 и т.д., чтобы я мог их также попорядку также обработать.

Хелп, гуру СИшарпа.
Подсобите работающим кодом.
 
Индусский код
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
Ну или норм вариант
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
Первый вариант вполне норм, зачем вы так))
 
  • Оценить
Реакции: Radzhab
Что-то у меня не работает.
В первом коде выплевывает:
Снимок-66.png
Во втором коде:
Снимок-67.png

Зп 5.8.7.0
 
buffList.add(list); точку с запятой поставь
 
Add, Clear замени
 
  • Оценить
Реакции: LightWood
Поправил. Сейчас выглядит так:
Код:
Развернуть Свернуть Копировать
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();
     }
}
Выполнился успешно, но выходных файлов не вижу.
Либо их нет, либо где они?
 
Кроме названия списка ничего не менял в коде.
Разделитель в файле 6666. Список привязан.
 
:D Radzhab наверно их засекретил))
 
или, чтоб файл создавался в директории проекта:
File.WriteAllLines(project.Directory+"\"+index+".txt",buffList);
 
  • Оценить
Реакции: LightWood
за что обделили стоковый сплит=/?
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
рассекретили)))
 
Спасибо, парни. Выручили.
В кодах есть ошибки, то на регистр ругается, кое-где не хватает обратных слешей чтобы файл корректно подхватывался и т.д.
Разобрался и поправил. Вот 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());
   }
 
Народ, не подскажите почему не срабатывает код:

b772e7ab1e.png
 
Делайте не в тестере, а в блоке C# В проекте. Тестер не подхватывает Using
 
  • Оценить
Реакции: mrfeathers
Подскажите, а можно разбить файл (порядка 6 ГБ) на более мелкие по количеству строк (к примеру, по 100 000 строк на каждый файл) с порядковым нумерованием (брать исходное название и добавлять порядковый номер)?
 
  • Оценить
Реакции: Radzhab
Подскажите, а можно разбить файл (порядка 6 ГБ) на более мелкие по количеству строк (к примеру, по 100 000 строк на каждый файл) с порядковым нумерованием (брать исходное название и добавлять порядковый номер)?
Так-то можно конечно. Даже стандартными кубиками можно сделать, но через сишарп есть явно какие-то максимально подходящие методы, чтобы всё шустренько обработалось.
Те кто шарит, подскажет думаю вскоре.
 
Так-то можно конечно. Даже стандартными кубиками можно сделать, но через сишарп есть явно какие-то максимально подходящие методы, чтобы всё шустренько обработалось.
Те кто шарит, подскажет думаю вскоре.
да уже нашел решение - поправил шаблон, чтобы изначально дубли строк не создавал при работе, файл очень уменьшился :-). Только учусь, так что ошибки неизбежны.
 
да уже нашел решение - поправил шаблон, чтобы изначально дубли строк не создавал при работе, файл очень уменьшился :-). Только учусь, так что ошибки неизбежны.
Гуд :-)
 

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