2014-11-07 2 views
0

У меня есть запрос на работу, чтобы прочитать | разделите файл и добавьте разрыв строки каждые 6 значений и напишите его в новый файл. Данные в текстовый файл выглядит так (фактические значения были скрыты):Добавить разрыв строки каждые 6 элементов в строке

product|11111111|name|2006-10-09|code1|code2 product|22222222|name|2006-10-09|code1|code2 product|33333333|name|2011-02-03|code1|code2 

Я использую следующий код, чтобы прочитать файл, а затем вывести его на новый файл:

// Read the txt file 
StreamReader reader = new StreamReader(FileUpload1.FileContent); 
string formattedText = reader.ReadToEnd(); 
File.WriteAllText(Server.MapPath("~/filename.txt"), formattedText); 

Итак, в этом примере мне нужно будет добавить разрыв строки после 6-го значения. Я относительно новичок в ASP.net, поэтому я уверен, что я пропустил что-то довольно простое.

+1

Хорошо, на ваш вопрос? Все, что вы сделали, это прочитать файл и переписать его точно так, как было. Не кажется, что вы на самом деле пытались что-либо сделать для достижения своей цели. Вы должны прочитать чтение файлов и синтаксический анализ строк на C#, там много материала. – tnw

+4

Пожалуйста, не просто попросите нас решить проблему за вас. Покажите нам, как _you_ попытался решить проблему самостоятельно, а затем покажите нам _exactly_, каким был результат, и скажите, почему вы считаете, что это не сработало. См. «[Что вы пробовали?] (Http://whathaveyoutried.com/)» за отличную статью, которую вы действительно должны прочитать. –

+0

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

ответ

1

Если у вас есть только одну строку без каких-либо перерывов, вы могли бы сделать что-то вроде этого:

var source = "product|11111111|name|2006-10-09|code1|code2|product|22222222|name|2006-10-09|code1|code2|product|33333333|name|2011-02-03|code1|code2"; 
var cells = source.Split('|'); // or use \t if it's really tabs 

var lines = string.Join("\n", cells.Select((c,i) => new { c, i }) 
    .GroupBy(x => x.i/6) 
    .Select(x => string.Join("|", x.Select(y => y.c)))); 

Console.WriteLine(lines); 

И тогда вы можете просто написать lines в файл, как вы были раньше.

Как это работает:

  • Split исходная строка на разделитель, чтобы создать массив строк
  • Select каждый из этих клеток в анонимный объект с его значением (c), и это индекс (i)
  • GroupBy те объекты, которые используют индекс, деленный на 6 (усеченный, потому что это целочисленное деление - поэтому предметы 0...5 в конечном итоге входят в группу 0, пункты 6...11 в конечном итоге в группе 1 и элементах 12...17 кончают в группе 2)
  • Для каждой группы Select результата string.Join ИНГ всех значений вместе, чтобы дать одну строки для каждой группы
  • Тогда Join всех этих строк вместе с \n ,

См: https://dotnetfiddle.net/j5gWgC

0
 using (var sr = new StreamReader(FileUpload1.FileContent)) 
     { 
      string line; 
      int count = 1; 
      while ((line = sr.ReadLine()) != null) 
      { 
       File.WriteAllText(Server.MapPath(string.Format("~/filename.txt{0}", count), line); 
       count ++; 
      } 
     } 

Это позволит сохранить каждую строку вашего ввода в виде файла. Переменная 'count' используется для создания отдельных имен файлов.

+0

Я не верю, что это то, что пытается сделать ОП. Кроме того, ваш 'string.Format' ошибочен. Я предполагаю, что вы имели в виду нечто вроде: 'string.Format (" ~/filename {0} .txt ", count)' –

+0

Да, я забыл добавить местозаполнитель, спасибо, что поймал это. Мне показалось, что это он искал. Если нет, он может игнорировать мой ответ. – wblanks

0

Мне нравится LINQ ответ Мэтта Берланд, но если вы чувствуете, как использовать более прямой подход, вы всегда можете просто использовать while петлю с StringBuilder:

var str = "product|11111111|name|2006-10-09|code1|code2|product|22222222|name|2006-10-09|code1|code2|product|33333333|name|2011-02-03|code1|code2"; 
var delimiter = "|"; 
var sb = new StringBuilder(); 

// using a list for the List<T>.GetRange() method (see below) 
var splitString = str.Split(new [] { delimiter }, StringSplitOptions.None).ToList(); 

var index = 0; 
var numValues = 6; 
while (index + numValues <= splitString.Count) 
{ 
    sb.AppendLine(String.Join(delimiter, splitString.GetRange(index, numValues))); 
    index += numValues; 
} 

Console.WriteLine(sb.ToString()); 

/* 
    Output: 
    product|11111111|name|2006-10-09|code1|code2 
    product|22222222|name|2006-10-09|code1|code2 
    product|33333333|name|2011-02-03|code1|code2 
*/ 

Опять же, это предполагает, что все в одна линия.

Смежные вопросы