csv列文本之间的引号导致在导入csv数据时跳过剩余列

时间:2011-06-08 12:24:09

标签: c# import-from-csv

我使用以下代码从csv文件中获取数据:

    public DataTable GetCSVData(string CSVFileName)
    {
        string CSVConnectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + ConfigurationSettings.AppSettings["CSVFolder"].ToString() + ";Extensions=asc,csv,tab,txt;Persist Security Info=False;";

        using (OdbcConnection Connection = new OdbcConnection(CSVConnectionString))
        {
            DataTable CSVDataTable = new DataTable();

            string SelectQuery = string.Format(@"SELECT * FROM [{0}]", CSVFileName);

            OdbcDataAdapter Adapter = new OdbcDataAdapter(SelectQuery, Connection);

            Adapter.Fill(CSVDataTable);

            return CSVDataTable;
        }
    }

确切的问题是,如果csv列包含以粗体字母突出显示的数据,请在下面的第1行中显示

Row1-> col1,“cdwdf”dsdfs ,col2,col3

使用上面的代码获取数据时跳过col2和col3(突出显示的文本后面的列),然后继续从下一行获取数据。

如果Row1中提到的列文本完全在引号内(“cdwdf dsdfs”),则可以正确获取数据。

任何人请告诉我如何在这种情况下从csv获取数据......

2 个答案:

答案 0 :(得分:2)

我会使用Fast CSV Reader,因为它非常快速且擅长识别csv文件结构。

答案 1 :(得分:2)

双引号是csv specification的一部分。如果您的数据包含双引号,则整个字段(或列)必须用双引号括起来,并且必须使用双引号对字段内的任何双引号进行转义。

所以你的行应该是这样的:

Row1-> col1,"""cdwdf"" dsdfs",col2,col3

我没有使用任何CSV库,所以我不推荐任何,但你可以自己轻松地解析文件。只需逐行读取文件并按','拆分。这个问题是跨越多行的字段....

编辑:总而言之,您需要修改CSV输入文件或找到更宽容的解析器,或者在发现格式错误的CSV记录时至少会抛出异常。乍一看,FAST CSV reader其他人提出的建议似乎是一个很好的起点,因为它声称格式错误的CSV会导致其失败并出现有意义的异常。