【问题标题】:Importing Data from a csv file从 csv 文件导入数据
【发布时间】:2015-06-30 00:00:57
【问题描述】:

我有一个 csv 文件。 当我尝试使用 filestream readtoend() 读取该文件时,我在许多地方得到了逗号和\r,这破坏了我在每列中的行数。 有没有办法删除引号和\r。 我试图替换

 FileStream obj = new FileStream();
string a = obj.ReadToEnd();
a.Replace("\"","");
a.Replace("\r\"",""); 

当我想象一个所有的 \r 和引号被删除时。 但是当我从头开始使用ReadLine() 再次读取文件时,它们又出现了?

【问题讨论】:

  • 你为什么不逐行阅读并取消每个逗号和换行符?那么你可以用逗号分开
  • 您正在替换 in 您的字符串,而不是 in 您的文件。
  • 您看到的是不可打印的字符,并添加在您正在使用的特定工具中,以查看您阅读的字符串的内容。 Replace() 操作在文件内容的内存副本中起作用,因此不会修改其内容。
  • 简单地删除双引号和换行符只会损坏您的数据 - 双引号内的任何逗号都应被视为数据,而不是分隔符。
  • 那么,Sagar 手头的问题到底是什么?您在将更改写回文件时需要帮助,还是只想解释正在发生的事情?

标签: c# winforms


【解决方案1】:

首先,字符串是不可变的。您可能认为这对您的问题并不重要,但实际上在您进行开发时它很重要。 如果我查看你的代码 sn-p,我很确定你对不可变对象一无所知,所以我建议你确保你完全理解这个概念。

关于不可变对象的更多信息可以找到:http://en.wikipedia.org/wiki/Immutable_object

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

这就是 Replace 方法返回值的原因,其文档可在此处找到:https://msdn.microsoft.com/en-us/library/system.string.replace%28v=vs.110%29.aspx 并明确指出它返回一个新字符串,其中当前实例中指定字符串的所有出现都替换为另一个指定的字符串。

在您的示例中,您没有使用 Replace 函数的返回值。 你能告诉我们字符串值实际上是从你的 a 变量中替换的吗?因为我不相信会是这样。当您可视化一个字符串时,回车符 (\r) 不是可视的,而是由实际的回车符代替。如果您调试并查看实际的字符串值,您仍然应该看到 \n。

取如下代码sn-p:

var someString = "Hello / world";
someString.Replace("/", "");
Console.Log(someString);

您可能认为控制台会显示“Hello world”。但是,在这个小提琴中,您可以看到它仍然记录“Hello / World”:https://dotnetfiddle.net/cp59i3

你必须做些什么才能正确使用 String.Replace 可以在这个小提琴中看到:https://dotnetfiddle.net/XCGtOu

基本上,你想要记录 Replace 函数的返回值:

var a = "Some / Value";
var b = a.Replace("/", "");
Console.WriteLine(b);

另外,正如其他人在您帖子的评论部分中提到的那样,您不会替换文件的内容,而是替换内存中的字符串变量。

如果要保存新字符串,请务必使用 FileStream 的 Write 方法(或任何其他方式写入文件),可以在此处找到说明:How to Find And Replace Text In A File With C#

除了我在整个答案中所说的所有内容之外,您应该 在大多数情况下替换文件中的引号和回车符,它们是为了一个原因。除非你有特定的原因。

【讨论】:

  • 谢谢,我真的不知道可变对象和不可变对象。我还没有找到解决方案,我会尽快回复:)
【解决方案2】:

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

    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();
    }

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

【讨论】:

  • 嗨,有点晚了,但我做了一些修改。首先,您不正确地处理 FileStream。 => dotnetfiddle.net/69mW8r 下一件事:如果您的文件获得例如 4GB,那么您将需要 4GB 的可用 RAM,因为您正在完全在内存中读取文件 (ReadToEnd)。这可以通过流媒体解决:dotnetfiddle.net/UUn3Ex 但我不确定这是否适用于您的用例。但总的来说,最好不要使用 ReadToEnd,但它可能适合您的情况! :-)
【解决方案3】:

试试这样的

           StreamReader  sReader = new StreamReader("filename");
            string a = sReader.ReadToEnd();
            a.Replace("\"", "");
            a.Replace("\r\"", "");
            StringReader reader = new StringReader(a);
            string inputLine = "";
            while ((inputLine = reader.ReadLine()) != null)
            {
            }

【讨论】:

  • 您是否实际测试过这是否有效? :-) 阅读我的答案,了解为什么您的示例不起作用。
猜你喜欢
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 2016-08-14
  • 2017-10-14
  • 2011-05-23
相关资源
最近更新 更多