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

C# 使用内联逗号拆分逗号分隔的csv文件,c#,asp.net,vb.net,csv,.net,C#,Asp.net,Vb.net,Csv,.net,我正在使用拆分逗号分隔的CSV文件 此代码如下所示。它很好用,但有些唱片 该文件在数据中包含逗号,即使逗号是保留的 作为分隔符。例如,记录包含一个描述文本,其中用户 已输入逗号,并且我的脚本输入了与记录结尾类似的前缀。 我怎么才能克服呢 下面是我的CSV文件中的一行示例。请注意,行尾的空记录可以不带“”封闭字符: “1”、“34353434”、“亚当”、“特拉克斯”、“343”、“这个人是老板,请尊重地处理”、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、” 以下是我阅读和

我正在使用拆分逗号分隔的CSV文件 此代码如下所示。它很好用,但有些唱片 该文件在数据中包含逗号,即使逗号是保留的 作为分隔符。例如,记录包含一个描述文本,其中用户 已输入逗号,并且我的脚本输入了与记录结尾类似的前缀。 我怎么才能克服呢

下面是我的CSV文件中的一行示例。请注意,行尾的空记录可以不带“”封闭字符:

“1”、“34353434”、“亚当”、“特拉克斯”、“343”、“这个人是老板,请尊重地处理”、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、”

以下是我阅读和拆分的方式:

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
有人能帮忙吗?也许这只是一个我看不到的简单解决方案:-)

使用合适的CSV解析器-是一个流行的选择

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

这些处理了CSV的微妙方面,大多数手卷的解决方案直到遇到问题才考虑。

< P>使用适当的CSV解析器-是一个流行的选项。

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


这些处理了CSV的微妙方面,大多数手卷的解决方案直到遇到问题才考虑。

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

有两个基本条件:

  • 分隔符标记调用EncloseInt整个内部字符串来引用标记(如果您有
    x,y
    ,并且分隔符是逗号,在CSV中您会得到
    “x,y”
  • 引号作为双引号转义(如果您有
    他们在CSV中说“嘿!”
    ,您会得到
    “他们说“嘿!”
  • 其他字符串将在您键入时保存

    你不能用这个规则转移你的最后一部分。 尝试将逗号改为分号并导入Excel。Excel显示您的示例,如下所示:

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

    public List ParseCsvRow(字符分隔符,字符串输入)
    {
    列表结果=新列表();
    字符串步长=”;
    布尔逃逸=假;
    StringBuilder StringBuilder=新的StringBuilder();
    int位置=-1;
    做
    {
    如果(++位置>=input.Length)
    {
    Add(stringBuilder.ToString());
    stringBuilder=null;
    打破
    }
    步骤=输入子串(位置1);
    开关(步骤)
    {
    大小写“\”:
    if(stringBuilder.Length==0&&!转义)
    {
    逃逸=真;
    继续;
    }
    if(位置+1<输入长度)
    步骤=输入。子字符串(++位置,1);
    其他的
    步骤=”;
    如果(步骤==“\”)
    {
    stringBuilder.Append(“\”);
    继续;
    }
    if(step.Equals(delimiter.ToString())&转义)
    {
    Add(stringBuilder.ToString());
    stringBuilder.Clear();
    逃逸=假;
    继续;
    }
    打破
    违约:
    if(step.Equals(delimiter.ToString())&&&!转义)
    {
    Add(stringBuilder.ToString());
    stringBuilder.Clear();
    继续;
    }
    stringBuilder.Append(步骤);
    继续;
    }
    }虽然(正确);
    返回结果;
    }
    
    您的示例可能不正确。
    句子后面的最后一部分说:

    有两个基本条件:

  • 分隔符标记调用EncloseInt整个内部字符串来引用标记(如果您有
    x,y
    ,并且分隔符是逗号,在CSV中您会得到
    “x,y”
  • 引号作为双引号转义(如果您有
    他们在CSV中说“嘿!”
    ,您会得到
    “他们说“嘿!”
  • 其他字符串将在您键入时保存

    你不能用这个规则转移你的最后一部分。 尝试将逗号更改为分号并导入Excel。Excel将显示以下示例:

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

    public List ParseCsvRow(字符分隔符,字符串输入)
    {
    列表结果=新列表();
    字符串步长=”;
    布尔逃逸=假;
    StringBuilder StringBuilder=新的StringBuilder();
    int位置=-1;
    做
    {
    如果(++位置>=input.Length)
    {
    Add(stringBuilder.ToString());
    stringBuilder=null;
    打破
    }
    步骤=输入子串(位置1);
    开关(步骤)
    {
    大小写“\”:
    if(stringBuilder.Length==0&&!转义)
    {
    逃逸=真;
    继续;
    }
    if(位置+1<输入长度)
    步骤=输入。子字符串(++位置,1);
    其他的
    步骤=”;
    如果(步骤==“\”)
    {
    stringBuilder.Append(“\”);
    继续;
    
        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;
        }