C# CSV与;在存在多个“";”时分隔为列最后

C# CSV与;在存在多个“";”时分隔为列最后,c#,csv,C#,Csv,我有一个程序,可以制作一些数据的CSV文件。这些CSV文件用分隔;“由于某种原因,它们以一个结尾”。下面是这些字符串的一些示例: hello "; world "; 123 " how "; are "; you " 现在这些行很容易阅读,但现在也有这样的行: just "; a "; li"ne" " and "; another "; one"1" " 由于这些行确实有“,我的代码将失败,并出现错误:Microsoft.VisualBasic.FileIO.MalformedLineEx

我有一个程序,可以制作一些数据的CSV文件。这些CSV文件用
分隔;“
由于某种原因,它们以一个
结尾”
。下面是这些字符串的一些示例:

hello "; world "; 123 "
how "; are "; you "
现在这些行很容易阅读,但现在也有这样的行:

just "; a "; li"ne" "
and "; another "; one"1" "
由于这些行确实有
,我的代码将失败,并出现错误:
Microsoft.VisualBasic.FileIO.MalformedLineException:无法使用当前分隔符分析行x。

我的代码现在看起来像这样:

using (TextFieldParser csvReader = new TextFieldParser(csv_file_path, Encoding.GetEncoding("windows-1250"))) //windows 1250 is the correct character encoding for European characters 
    {
        csvReader.SetDelimiters(new string[] { ";" });
        csvReader.HasFieldsEnclosedInQuotes = true;
                            while (!csvReader.EndOfData)
        {
            string[] fieldData = csvReader.ReadFields();
            for (int i = 0; i < fieldData.Length; i++)
            {
                if (fieldData[i] == "")
                {
                    fieldData[i] = null;
                }
            }
            csvData.Rows.Add(fieldData);
        }
    }
使用(TextFieldParser csvReader=new TextFieldParser(csv_file_path,Encoding.GetEncoding(“windows-1250”))//windows 1250是欧洲字符的正确字符编码
{
SetDelimiters(新字符串[]{;“});
csvReader.HasFieldsEnclosedInQuotes=true;
而(!csvReader.EndOfData)
{
字符串[]fieldData=csvReader.ReadFields();
for(int i=0;i
问题在于,我在注释中输入的分隔符设置错误:

林帕德 输出

为什么
HasFieldsEnclosedInQuotes
为真?它们没有括在引号中,只是以引号结尾。在Sjors注释的附加部分,您的分隔符似乎是
,但您只需使用
调用
SetDelimiters
。你试过使用正确的分隔符吗?@SjorsOttjes你是对的,我的错。我改了now@RB. 我尝试了以下方法:
csvReader.SetDelimiters(新字符串[]{“\”;“})
并获得了
system.argumentexception:输入数组长度不超过此表中的列数
即使是CSV文件,此格式也会出错……您不能做些什么来获得正确格式的CSV吗(一个分隔符,可能使用
作为字段的封闭字符)?嘿,我在最后一行中也犯了一个错误,应该是:另一个“;一个。它解决了我的问题,现在我在我的分离部分只得到了一些
。在第一、第三和第五部分我得到了
在结尾和结尾处beginning@wouterdejong只有最后一个部分才有尾随
,这是因为您的输入数据有尾随
。我建议删除所有尾随
文件读取前的字符…不知何故,它只能以
csvReader.SetDelimiters(新字符串[]{;”})
而不是
{“\”;”}
的方式工作(根据我附加的代码)。我所做的唯一更改是正确设置分隔符,将编码设置为1252。”(对于我的机器来说这是正确的)并将HasFieldSenClosedQuotes设置为false。您运行我的代码查看输出了吗?我确实将HasFieldSenClosedQuotes设置为false,这似乎起到了作用。
using (TextFieldParser csvReader = new TextFieldParser(@"C:\temp\temp.csv", Encoding.GetEncoding("windows-1252")))
{
    csvReader.SetDelimiters(new string[] { "\";" });
    csvReader.HasFieldsEnclosedInQuotes = false;
    while (!csvReader.EndOfData)
    {
        string[] fieldData = csvReader.ReadFields();
        for (int i = 0; i < fieldData.Length; i++)
        {
            if (fieldData[i] == "")
            {
                fieldData[i] = null;
            }
        }
        fieldData.Dump();
    }
}
hello "; world "; 123 "
how "; are "; you "
just "; a "; li"ne" "
and "; another " one"1" "