我写过这段代码但有一些问题:
const int maxPeopleInFile = 2;
using (StreamReader reader = new StreamReader(@"c:\mytest\SortedTest.txt"))
{
string[] columnheaders = reader.ReadLine().Split(',');
List<string> listKeeper = new List<string>();
int fileNumber = 1;
while (reader.Peek() > 0)
{
string[] currentRowValues = reader.ReadLine().Split(',');
string id = currentRowValues[2];
if (listKeeper.Count < maxPeopleInFile || (listKeeper.Count() <= maxPeopleInFile && listKeeper.Contains(id)))
{
if (!listKeeper.Contains(id))
{
listKeeper.Add(id);
}
var writer = File.CreateText("file_" + fileNumber + ".txt");
writer.Write(currentRowValues);
writer.Close();
}
else // new file
{
fileNumber++;
listKeeper = new List<string>();
var writer = File.CreateText("file_" + fileNumber + ".txt");
writer.Write(currentRowValues);
}
}
}
问题:
1:生成的文件没有我在string[] currentRowValues = reader.ReadLine().Split(',');
中读过的行
写入文件的内容是一行,文本为System.String[]
答案 0 :(得分:2)
由于currentRowValues
是一个数组,因此调用
writer.Write(currentRowValues);
相当于
writer.Write(currentRowValues.ToString());
生成您看到的输出(即System.String[]
),因为ToString()
不迭代各个字符串值。
您可以使用File.WriteAllLines
一次性将整个数组写入文件,如下所示:
File.WriteAllLines("file_" + fileNumber + ".txt", currentRowValues);
(来自评论) [我]想把[我从原始文件中读取的确切行]放在一个新文件中,就像以前在原始文件中一样
然后您应该使用string.Join
撤消string.Split
:
writer.Write(string.Join(",", currentRowValues));
答案 1 :(得分:1)
这是因为currentRowValues
只是将FileStream.Write
传递回逗号分隔的值列表,因为它会写入ToString
的返回值。 1}}这是对象类型名称。
一种可能的方法可能是使用string.Join
:
writer.Write(string.Join(",", currentRowValues));
答案 2 :(得分:0)
您的问题出在此代码段中:
writer.Write(currentRowValues);
尝试:
writer.Write(currentRowValues[0]);
or
writer.Write(currentRowValues[1]);
取决于您的需求
答案 3 :(得分:0)
您需要为string
方法提供Write()
值,而不是string[]
。
我建议如下:
StringBuilder builder = new StringBuilder();
foreach (var currentValue in currentRowValues)
builder.Append(currentValue);
writer.Write(builder.ToString());
注意:不要忘记添加命名空间以便能够使用StringBuilder。