【问题标题】:Splitting comma delimited csv file with inline commas使用内联逗号拆分逗号分隔的 csv 文件
【发布时间】:2012-09-13 18:16:29
【问题描述】:

我正在拆分一个逗号分隔的 CSV 文件,方法是使用 下面这段代码。它工作正常,但其中的一些记录 该文件在数据中包含逗号,即使保留了逗号 作为分隔符。例如,一条记录包含一个描述文本,其中用户 输入了逗号,我的脚本输入了喜欢记录的结尾。 我怎么能以某种方式克服呢?

这是我的 CSV 文件中的一行示例。请注意,行尾的空记录可以没有“”括起来的字符:

"1","34353434","Adam","Traxx","343","这个人是老大,请尊重处理","",,"","",,"," ","0",,"

这就是我阅读和拆分的方式:

Sub ReadOnlineExample()
Dim line_read As String
Dim tempfilename As String
Dim i As Integer
Dim rows_skipped As Integer
Dim line_split(0 To 125) As String
Dim MortalityRates(0 To 125) As Double

 tempfilename = "C:\MortalityRateTable.csv"
 Dim sr As New System.IO.StreamReader(tempfilename)

'Split the line into individual data
line_split = line_read.Split(",")

'Save the split data into an array
For i = 0 To UBound(line_split)
  MortalityRates(i) = line_split(i)
Next i

End Sub

有人可以帮忙吗?也许这只是一个我看不到的简单解决方案:-)

【问题讨论】:

    标签: c# asp.net vb.net csv .net


    【解决方案1】:

    使用适当的 CSV 解析器 - File Helpers 是一个流行的选项。

    还有一个来自 Microsoft 的解析器 - 在 Microsoft.VisualBasic.FileIO 命名空间中,TextFieldParser

    这些解决了大多数手动解决方案在遇到问题之前不会考虑的 CSV 的微妙方面。

    【讨论】:

    • 你再同意不过了!
    • 废话只是要发布!
    • +1 - 这是一个真正不需要重新发明的轮子。
    • 您好,那个File.IO.TextFieldParser 好像是根据我的需要量身定做的,不知道为什么我之前没有遇到过这个,正在寻找文件读取解决方案。
    • - 但它如何解决我的问题呢?它是否具有处理引号内数据中逗号的内置功能??
    【解决方案2】:

    您的示例可能不正确。
    后半句说:"",,"","",,","","0",,"

    有两个基本条件:

    1. delimiter mark 调用 enclosint 整个内部字符串到引号(如果你有 x,y,并且 delimiter 是逗号,在 CSV 中你会得到 "x,y"
    2. 引号被转义为双引号(如果您在 CSV 中有 They say "Hey!",则会得到 "They say ""Hey!"""

    其他字符串将在您键入时保存。

    并且您不能使用此规则转移您的最后一部分。 尝试将逗号更改为分号并导入 Excel。 Excel 显示您的示例如下:

    在我的国家是标准的 CSV 分隔符分号。
    我编写此代码用于解析 CSV。您可以根据自己的目的尝试修改它(分隔符是可变的):

        public List<string> ParseCsvRow(char delimiter, string input)
        {
            List<string> result = new List<string>();
            string step = "";
            bool escaped = false;
            StringBuilder stringBuilder = new StringBuilder();
            int position = -1;
    
            do
            {
                if (++position >= input.Length)
                {
                    result.Add(stringBuilder.ToString());
                    stringBuilder = null;
                    break;
                }
                step = input.Substring(position, 1);
                switch (step)
                {
                    case "\"":
                        if (stringBuilder.Length == 0 && !escaped)
                        {
                            escaped = true;
                            continue;
                        }
                        if (position + 1 < input.Length)
                            step = input.Substring(++position, 1);
                        else
                            step = "";
                        if (step == "\"")
                        {
                            stringBuilder.Append("\"");
                            continue;
                        }
                        if (step.Equals(delimiter.ToString()) && escaped)
                        {
                            result.Add(stringBuilder.ToString());
                            stringBuilder.Clear();
                            escaped = false;
                            continue;
                        }
                        break;
                    default:
                        if (step.Equals(delimiter.ToString()) && !escaped)
                        {
                            result.Add(stringBuilder.ToString());
                            stringBuilder.Clear();
                            continue;
                        }
                        stringBuilder.Append(step);
                        continue;
                }
            } while (true);
            return result;
        }
    

    【讨论】:

      猜你喜欢
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多