在字符串中每6个项添加换行符

时间:2014-11-07 18:27:26

标签: c# asp.net

我有工作要求阅读|分隔文件并每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比较陌生,所以我确信我错过了一些相当容易的东西。

3 个答案:

答案 0 :(得分: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中,项目{{1}最终在小组6...11中,而项1最终在小组12...17中)
  • 对于每个组,2 Select将所有值组合在一起,以便为每个组提供一个字符串
  • 然后string.Join所有这些字符串与Join一起。

请参阅:https://dotnetfiddle.net/j5gWgC

答案 1 :(得分: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'变量用于创建不同的文件名。

答案 2 :(得分:0)

我喜欢Matt Burland的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
*/

同样,这假设所有内容都在一行中。