使用内联逗号分隔逗号分隔的csv文件

时间:2012-09-13 18:16:30

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

我正在使用分割逗号分隔的CSV文件 这段代码如下。它工作正常,但有些记录在 即使保留逗号,该文件也包含数据中的逗号 作为分隔符。例如,记录包含用户的描述文本 已输入逗号,我的脚本输入就像记录结束一样。 我怎么能以某种方式克服它?

以下是我的CSV文件中的一行示例。请注意行末尾的空记录可以是“”括号中的字符:

“1”,“34353434”,“亚当”,“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

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

2 个答案:

答案 0 :(得分:6)

使用正确的CSV解析器 - File Helpers是一种受欢迎的选项。

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

这些涉及CSV的细微方面,大多数手动解决方案在遇到问题之前都不会考虑。

答案 1 :(得分:0)

你的例子可能不正确 句子后面的最后一部分说:"",,"","",,","","0",,"

有两个基本条件:

  1. 分隔符标记调用coverosint整个内部字符串以引用标记(如果您有x,y,分隔符是逗号,则以CSV格式获取"x,y"
  2. 引号以双引号标记转义(如果您使用CSV They say "Hey!"获得"They say ""Hey!"""
  3. 键入时会保存其他字符串。

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

    enter image description here

    在我的国家/地区是标准的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;
        }