【问题标题】:C# CSV Imports Into Listbox With QuotationsC# CSV 导入到带有引号的列表框中
【发布时间】:2015-09-16 02:08:54
【问题描述】:

请看下面的代码。我正在打开一个 .CSV 文件并将其读入列表框,而不是作为 - X 是 Z 这是 “X” “是” “Z”

相关代码为:

            if(ofdCSV.ShowDialog() == DialogResult.OK)
        {
            list.Visible = true;
            StreamReader sr = new StreamReader(ofdCSV.FileName);
            string currentLine;
            while ((currentLine = sr.ReadLine()) != null)
            {
                    list.Items.Add(currentLine);

            }

有什么想法吗?我已经环顾了一段时间,但我还是个新手,所以我不完全确定要寻找什么。

【问题讨论】:

  • CSV 文件通常也可以用引号分隔,以管理否则将被视为分隔符的嵌入逗号。想想“史密斯,约翰”的案例。修剪前导和尾随引号,您将获得所需的结果。

标签: c# csv listbox visual-studio-2015 streamreader


【解决方案1】:

CSV 文件是一个常见的例子,它总是比您乍一看更复杂。该过程通常始于您认为您知道 csv 文件的工作原理并编写一些简单的代码。然后,随着您发现越来越多的边缘情况,您会逐渐积累越来越多的代码。最后阶段是您的所有代码最终都将被丢弃,转而使用第 3 方 CSV 解析器,例如 Filehelpers

.net 框架有 TextFieldParser,如果你设置它会做得很好

Delimiters = new string[] { "," };
HasFieldsEnclosedInQuotes = true;

更详细的解释可以找到here。 与使用整个其他库相比,它的开销要小,但如果你给它输入一行,它可能会崩溃

菱角,10' 杆,1" 直径",午餐

但您可能也不想对其进行正则表达式。

【讨论】:

    【解决方案2】:

    您可以尝试使用Replace 删除引号。

    list.Items.Add(currentLine.Replace('"', '').Trim());
    

    list.Items.Add(currentLine.Replace("\"", string.Empty));;
    

    【讨论】:

      【解决方案3】:

      我已经编写了以下声明,据我所知,这些声明可以正常创建 CSV 数据。这里的重点是 CSV 数据可以跨越多行。希望这会有所帮助。

      public static string Escape(string val)
      {
          if (val == null)
              return "";
      
          while (val.EndsWith("\r\n"))
              val = val.Remove(val.Length - 2, 2);
      
          if (val.Contains("\t"))
              val = val.Replace("\t", "    ");
      
          if (val.Contains("\r\n"))
              val = val.Replace("\r\n", "\n");
      
          if (val.Contains("\r"))
              val = val.Replace("\r", "\n");
      
          if (val.Contains("\""))
              val = val.Replace("\"", "\"\"");
      
          if (val.Contains(",") ||
              val.Contains("\"") ||
              val.Contains("\n") ||
              val.StartsWith(" ") ||
              val.EndsWith(" "))
          {
              val = "\"" + val + "\"";
          }
          return val;
      }
      

      【讨论】:

        猜你喜欢
        • 2019-06-13
        • 2017-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-29
        相关资源
        最近更新 更多