1

我正在使用下面的代码拆分逗号分隔的 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

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

4

2 回答 2

6

使用适当的 CSV 解析器 -文件助手是一个流行的选项。

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

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

于 2012-09-13T18:18:00.783 回答
0

您的示例可能不正确。
句后的最后一部分说:"",,"","",,","","0",,"

有两个基本条件:

  1. 分隔符标记调用 enclosint 整个内部字符串以引用标记(如果您有x,y,并且分隔符是逗号,则在 CSV 中您会得到"x,y"
  2. 引号被转义为双引号(如果你有They say "Hey!"CSV 你得到"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;
    }
于 2013-05-14T16:28:31.813 回答