CSV实际上是分号分隔值,逗号分隔值在AZERTY键盘上导出到Excel时会有问题。

3

我有点困惑。

当我使用Excel 2003将工作表导出为CSV时,它实际上使用的是分号...

Col1;Col2;Col3
shfdh;dfhdsfhd;fdhsdfh
dgsgsd;hdfhd;hdsfhdfsh

现在当我使用Microsoft驱动程序读取csv文件时,它期望逗号并将列表视为一个大列?

我怀疑Excel导出使用分号是因为我有一个AZERTY键盘。但是,CSV阅读器是否也必须考虑不同的分隔符?

如何知道适当的分隔符,并/或正确读取csv文件?

    public static DataSet ReadCsv(string fileName)
    {
        DataSet ds = new DataSet();
        string pathName = System.IO.Path.GetDirectoryName(fileName);
        string file = System.IO.Path.GetFileName(fileName);
        OleDbConnection excelConnection = new OleDbConnection
        (@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties=Text;");
        try
        {
            OleDbCommand excelCommand = new OleDbCommand(@"SELECT * FROM " + file, excelConnection);
            OleDbDataAdapter excelAdapter = new OleDbDataAdapter(excelCommand);
            excelConnection.Open();
            excelAdapter.Fill(ds);
        }
        catch (Exception exc)
        {
            throw exc;
        }
        finally 
        {
            if(excelConnection.State != ConnectionState.Closed )
                excelConnection.Close();
        }
        return ds;
    } 
4个回答

9

一种方法是使用一个不错的CSV库,您可以在其中指定分隔符:(参考)

using (var csvReader = new CsvReader("yourinputfile.csv"))
{
    csvReader.ValueSeparator = ';';
    csvReader.ReadHeaderRecord();

    while (csvReader.HasMoreRecords)
    {
        var record = csvReader.ReadDataRecord():
        var col1 = record["Col1"];
        var col2 = record["Col2"];
    }
}

1
这个库看起来很不错...我们可以在商业应用中使用吗?从许可证中我们无法确定...此外,在我们的“关于”窗口中是否需要署名,那应该是什么?感谢您的回答和分享您的库。 - Run CMD
1
绝对没问题 - 这个许可证非常宽松。不需要署名 - 你在这里的点赞就足够了 :) 但如果你真的喜欢它,可以在CodePlex网站上写一篇评论,那将不胜感激。 - Kent Boogaart
很遗憾,我们的目标是.NET 2.0,无法添加对KBCsv库的引用。我们尝试打开源代码项目,但只有VS2003和VS2008。是否有适用于.NET 2.0的版本?或者我可能错过了什么吗? 非常感谢 :-) - Run CMD
3
我去掉了对官方.NET 2.0的支持,只是因为我想减少时间的承诺。但既然你需要它,我已经为你添加了最新版本的2.0构建。请参见http://kbcsv.codeplex.com/releases/view/36254。 - Kent Boogaart
哇,老兄,你太棒了!谢谢。只是为了正确性:csvReader.ValueDelimiter = ';';应该改为csvReader.ValueSeparator = ';';以适应我们这里的目的。(一开始会产生混淆的结果 :-)) - Run CMD
不客气。感谢您的纠正 - 我已经更新了我的帖子。是的,分隔符用于分隔需要被分隔的值(即包含分隔符字符的值),而分离器则用于分离值。 - Kent Boogaart

3

请检查您计算机上指定的分隔符。控制面板 > 区域和语言选项 > 区域选项标签 - 单击自定义按钮。那里有一个名为“列表分隔符”的选项。我怀疑这是设置为分号。


1
  • 针对德语版Windows 10的解决方案:

Change Windows system delimiter

  • 提到将十进制分隔符更改为 . ,并且可能也将千位分隔符更改为(细空格)。

真不敢相信这是真的... 逗号分隔值是由分号分隔的?


一些工具使用 .tsv 代替保存 制表符分隔值 - Tobi G.

0

正如dendarii所提到的,Excel使用的CSV分隔符是由您的区域设置确定的,具体来说是“列表分隔符”字符。 (在我看来,Excel错误地将其称为逗号分隔文件)

然而,如果这仍然无法解决您的问题,还有另一个可能的复杂情况:

检查您的“数字分组”字符,并确保它不是逗号。

当导出小数时,Excel似乎会恢复为分号,并且数字分组也设置为逗号。 将数字分组设置为句点/周期(.)对我有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接