我正在尝试从.csv文件写入新文件。
每次StreamWriter
写入时,它都会写入新文件的第一行。然后它会用下一个字符串覆盖该行,并继续这样做,直到StreamReader
到达EndOfStream
。
有没有人经历过这个?你是怎么克服的?
这是我学校工作所要求的第一个解决方案。原始文件中的行数未知。 .csv文件的每一行只有17列。我只需按下面代码片段中的顺序编写其中的三个
在对StreamWriter
进行编码之前,我使用了Console.WriteLine()
来确保每一行的顺序正确。
以下是代码段:
{
string path = @ "c:\directory\file.csv";
string newPath = @ "c:\directory\newFile.csv"
using(FileStream fs = new FileStream(path, FileMode.Open))
{
using(StreamReader sr = new StreamReader(fs))
{
string line;
string[] columns;
while ((line = sr.ReadLine()) != null)
{
columns = line.Split(',');
using(FileStream aFStream = new FileStream(
newPath,
FileMode.OpenOrCreate,
FileAccess.ReadWrite))
using(StreamWriter sw = new StreamWriter(aFStream))
{
sw.WriteLine(columns[13] + ',' + columns[10] + ',' + columns[16]);
sw.Flush();
sw.WriteLine(sw.NewLine);
}
}
}
}
}
答案 0 :(得分:2)
您应该在打开源的同一范围内打开目标,而不是在循环中打开目标,这将导致您每次使用OpenOrCreate
选项var path = @"c:\directory\file.csv";
var newPath = @"c:\directory\newFile.csv"
using(var sr = new StreamReader(new FileStream(path, FileMode.Open)))
using(var sw = new StreamWriter(new FileStream(newPath, FileMode.OpenOrCreate, FileAccess.ReadWrite)))
{
while(!sr.EndOfStream)
{
string line = sr.ReadLine();
var columns = line.Split(',');
sw.WriteLine(columns[13] + ',' + columns[10] + ',' + columns[16]);
sw.WriteLine(sw.NewLine);
}
sw.Flush();
}
覆盖文件。< / p>
row_number
我也希望您确定自己的CSV空格,因为您正在编码代码中的位置。
答案 1 :(得分:0)
首先,您要为每一行创建并关闭同一文件的写入流。这意味着每行都会覆盖该文件。你想在while循环之外使用你的使用块;但是,如果你坚持打开和关闭每一行的写入流,那么你需要使用FileMode.Append
{
string path=@"c:\directory\file.csv";
string newPath=@"c:\directory\newFile.csv"
using(StreamReader sr = new StreamReader(new FileStream(path, FileMode.Open))) // no need for 2 usings
using (FileStream aFStream = new FileStream (newPath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
string line;
string[] columns;
{
while((line = sr.ReadLine()) != null)
{
columns = line.Split(',');
using (StreamWriter sw = new StreamWriter(aFStream))
{
sw.WriteLine(columns[13] + ',' + columns[10] + ',' + columns[16]);
sw.Flush();
sw.WriteLine(sw.NewLine);
}
}
}
}
}
答案 2 :(得分:0)
要正确修复代码,您需要构建更多代码:
{
"cod":"200",
"message":0.0085,
"cnt":37,
"list":[
{
"dt":1492074000,
"main":{
"temp":8.74,
"temp_min":8.39,
"temp_max":8.74,
"pressure":1002.4,
"sea_level":1023.01,
"grnd_level":1002.4,
"humidity":94,
"temp_kf":0.35
},
"weather":[
{
"id":500,
"main":"Rain",
"description":"Lekki deszcz",
"icon":"10d"
}
],
"clouds":{
"all":32
},
(...)
你可以明显地定制并使其更灵活。但这应该证明并解决你的循环和流的一些问题。