我有工作要求阅读|分隔文件并每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比较陌生,所以我确信我错过了一些相当容易的东西。
答案 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
一起。答案 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
*/
同样,这假设所有内容都在一行中。