Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从csv文件导入数据_C#_Winforms - Fatal编程技术网

C# 从csv文件导入数据

C# 从csv文件导入数据,c#,winforms,C#,Winforms,我有一个csv文件。 当我尝试使用filestream readtoend读取该文件时,我会在许多地方得到倒逗号和\r,这会打断我在每列中的行数。 是否有方法删除倒逗号和\r\n。 我试着替换 FileStream obj = new FileStream(); string a = obj.ReadToEnd(); a.Replace("\"",""); a.Replace("\r\"",""); 当我可视化一个字符串时,所有\r和倒逗号都将被删除。 但是,当我使用ReadLine从头开

我有一个csv文件。 当我尝试使用filestream readtoend读取该文件时,我会在许多地方得到倒逗号和\r,这会打断我在每列中的行数。 是否有方法删除倒逗号和\r\n。 我试着替换

 FileStream obj = new FileStream();
string a = obj.ReadToEnd();
a.Replace("\"","");
a.Replace("\r\"",""); 
当我可视化一个字符串时,所有\r和倒逗号都将被删除。
但是,当我使用ReadLine从头开始再次读取文件时,它们会再次出现?

尝试类似的方法

StreamReader sReader=新的StreamReaderfilename; 字符串a=sReader.ReadToEnd; a、 替换\; a、 替换\r\; StringReader=新StringReadera; 字符串inputLine=; 当inputLine=reader.ReadLine!=无效的 {
} 首先,字符串是不可变的。你可能会认为这对你的问题并不重要,但实际上,无论你在发展什么时候,这都很重要。 如果我看一下您的代码片段,我很确定您不了解不可变对象,因此我建议您确保完全理解这个概念

有关不可变对象的更多信息,请参见:

基本上,这意味着永远不能修改字符串对象。每当我们更改值时,字符串总是指向一个新对象

这就是为什么Replace方法返回一个值,其文档可以在这里找到:并清楚地声明它返回一个新字符串,其中当前实例中指定字符串的所有匹配项都替换为另一个指定字符串

在您的示例中,您没有使用Replace函数的返回值。 您能告诉我们字符串值实际上是从a变量中替换出来的吗?因为我不相信会是这样。可视化字符串时,回车符\r不可见,并由实际回车符替换。如果调试并在实际字符串值处执行ALOK,则仍应看到\n

以以下代码段为例:

var someString = "Hello / world";
someString.Replace("/", "");
Console.Log(someString);
您可能认为控制台将显示Hello world。但是,在这个提琴上,您可以看到它仍然记录Hello/World:

要正确使用String.Replace,您必须执行的操作可以在此小提琴中看到:

基本上,您希望记录Replace函数的返回值:

var a = "Some / Value";
var b = a.Replace("/", "");
Console.WriteLine(b);
另外,正如其他人在ur post的评论部分所提到的,您并没有替换文件的内容,而是替换内存中的字符串变量

如果要保存新字符串,请确保使用FileStream的Write方法或任何其他写入文件的方式,可以在此处找到解释:


除了我在整个回答中所说的以外,您不应该在文件中同时替换倒逗号和回车符。在大多数情况下,它们的存在是有原因的。除非你有特殊的原因。

我终于成功了。谢谢大家。这是我做的代码

    FileStream obj = new FileStream();
        using(StreamReader csvr = new StreamReader(obj))
{
        string a = obj.ReadToEnd();
        a = a.Replace("\"","");
        a = a.Replace("\r\"","");
        obj.Dispose();
}

        using(StreamWriter Wr = new StreamWriter(TempPath))
        {
          Wr.Write(a);

    }

    using(StreamReader Sr = new StreamReader(Tempath))
    {
    Sr.ReadLine();
    }

我在系统上创建了一个临时路径。在这之后,很容易进入数据库

为什么不逐行阅读,并在每行中添加逗号和换行符?然后,您可以在COMMASY上拆分您正在替换字符串中的字符,而不是文件中的字符。您看到的是不可打印的字符,并添加到您用来查看读取的字符串内容的特定工具中。替换操作在文件内容的内存副本中工作,因此不会修改其内容。仅删除双引号和换行符只会损坏您的数据-双引号中的任何逗号都将被视为数据,而不是分隔符。那么,您手头的问题是什么?在将更改写回文件时,您需要帮助吗?还是只需要对发生的情况进行解释?您是否实际测试了此操作是否有效?:-请阅读我的答案,了解为什么您的示例不起作用。谢谢,我确实不知道可变和不可变对象。我还没有达成解决方案,我一完成就会回复:嗨,有点晚了,但我做了一些修改。首先,您没有正确地处理文件流。=>下一件事:例如,如果你的文件获得4GB的内存,那么当你在内存ReadToEnd中完全读取文件时,你将需要4GB的空闲RAM。这可以通过流媒体解决:但我不确定这是否适用于您的用例。但总的来说,最好不要使用ReadToEnd,但它可能适合您的情况!:-