同时使用两个流读取器比较和替换列和行?

问题描述

看,我正在编写一个简单的程序来替换CSV文件中的数据。

我需要替换的是第2列(父级)来设置ID的名称,而不是ID,如下所示:

原始文件:

ID    - PARENT - NAME
ID 1  -        - Name of ID 1
ID 2  -  ID 1  - Name of ID 2
ID 3  -  ID 2  - Name of ID 3
ID 4  -  ID 1  - Name of ID 4
ID 5  -  ID 4  - Name of ID 5

结果:

ID    - PARENT         - NAME
ID 1  -                - Name of ID 1
ID 2  -  Name of ID 1  - Name of ID 2
ID 3  -  Name of ID 2  - Name of ID 3
ID 4  -  Name of ID 1  - Name of ID 4
ID 5  -  Name of ID 4  - Name of ID 5

因此,我需要在这里使用同一StreamReader的两个实例进行递归循环,以比较每个实例。我不是在问如何执行循环,而是在同一时间使用两个流读取器,因为我试图通过创建所有必要的变量来做到这一点,但是C#似乎不会接受,而且只是不接受工作中,数据全为空白...也不产生任何错误。我该怎么办?

起作用的部分:

filePath = openFileDialog.FileName;
var fileStream = openFileDialog.OpenFile();
using (System.IO.StreamReader reader = new System.IO.StreamReader(fileStream,Encoding.GetEncoding("iso-8859-1")))
{
    fileContent = reader.ReadLine();
    int i = 1;
    using (System.IO.StreamWriter writer = new System.IO.StreamWriter(nomArxiu,false,Encoding.GetEncoding("iso-8859-1")))
   {
      while (fileContent != null)
          {
              /// code to replace stuff,works for one single row at a time,but not for multiple rows at the same time
          }
   }
writer.Flush();
writer.Close();
}

我尝试的方法无效:

System.IO.StreamReader reader2 = reader; // create a copy of the reader object...

我想访问同一文件的两个独立的流读取器,但是它不能像这样工作...

解决方法

您的代码存在的问题是C#中的类是通过引用而不是通过值传递的。

这意味着这一行:

System.IO.StreamReader reader2 = reader;

...不是像您期望的那样创建新的StreamReader,但是创建了另一个引用,该引用指向具有相同流位置的同一StreamReader

您需要做的是使用新的StreamReader创建一个新的FileStream,如下所示:

filePath = openFileDialog.FileName;
var fileStream = openFileDialog.OpenFile();
var secondFileStream = openFileDialog.OpenFile();
using (System.IO.StreamReader reader = new System.IO.StreamReader(fileStream,Encoding.GetEncoding("iso-8859-1")))
using (System.IO.StreamReader reader2 = new System.IO.StreamReader(secondFileStream,Encoding.GetEncoding("iso-8859-1")))
{
    fileContent = reader.ReadLine();
    int i = 1;
    using (System.IO.StreamWriter writer = new System.IO.StreamWriter(nomArxiu,false,Encoding.GetEncoding("iso-8859-1")))
    {
        while (fileContent != null)
        {
            /// code to replace stuff,works for one single row at a time,but not for multiple rows at the same time
        }
    }
    writer.Flush();
    writer.Close();
}

我不确定两次运行OpenFileDialog.OpenFile()的功能,因此,如果不起作用,请尝试以下操作:

filePath = openFileDialog.FileName;
using (FileStream fileStream = File.Open(openFileDialog.FileName,FileMode.Open,FileAccess.Read,FileShare.Read))
using (FileStream secondFileStream = File.Open(openFileDialog.FileName,FileShare.Read))
using (System.IO.StreamReader reader = new System.IO.StreamReader(fileStream,but not for multiple rows at the same time
        }
    }
    writer.Flush();
    writer.Close();
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...