StreamWriter只写一行

时间:2017-04-14 18:59:49

标签: c# csv streamwriter

我正在尝试从.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);
                }
            }
        }
    }
}

3 个答案:

答案 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
         },
(...)

你可以明显地定制并使其更灵活。但这应该证明并解决你的循环和流的一些问题。