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

本文关键字:csv 数据 导入 余列 文本 之间 | 更新日期: 2023-09-27 17:58:35

我正在使用以下代码从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行所示

行1->col1,"cdwdf"dsdfs,col2,col3

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

如果第1行中提到的列文本完全位于引号内("cdwdf-dsdfs"),则数据将被正确提取。

请告诉我在这种情况下如何从csv中获取数据。。。

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

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

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

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

我还没有使用任何CSV库,所以我不推荐使用任何,但您可以轻松地自己解析文件。只需逐行读取文件,然后按","拆分即可。这方面的问题是跨越多行的字段。。。。

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

我会使用Fast CSV Reader,因为它非常快速,并且善于识别CSV文件结构。