【问题标题】:Reading special characters from text file using OleDbConnection使用 OleDbConnection 从文本文件中读取特殊字符
【发布时间】:2015-08-14 22:30:32
【问题描述】:

我在使用 OleDbConnection 从文本文件中读取非 ASCII 字符时遇到问题。有任何想法吗?

这是我用来复制问题的测试方法

[TestMethod]
public void TestMethod1()
{
    var arquivo = new FileInfo(@"P:\import.txt");

    string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"{0}\\\";Extended Properties=\"Text;IMEX=1;FMT=Delimited\"", arquivo.DirectoryName);
    var conexaoFonteDados = new OleDbConnection(connectionString);
    conexaoFonteDados.Open();

    string instrucaoSql = "SELECT * FROM [" + arquivo.Name + "]";

    var com = new OleDbCommand(instrucaoSql, conexaoFonteDados);
    if (com.Connection.State != ConnectionState.Open)
    {
        com.Connection.Open();
    }

    var drDadosImportacao = com.ExecuteReader(CommandBehavior.CloseConnection);
    while (drDadosImportacao != null && drDadosImportacao.Read())
    {
        object valorImportado = drDadosImportacao["Column"];
        Console.WriteLine(valorImportado);
    }
}

这是import.txt文件内容:

Column
a
b
ç
á

这是控制台的输出:

a
b
?
?

解决方案

here 所述,您可以使用类似于此的方法将字符串转换为正确的编码:

public static class MyStringExtensions
{
    private static readonly Encoding Iso = Encoding.GetEncoding("ISO-8859-1");
    public static string RepairUtf8(this string value)
    {
        byte[] bytes = Iso.GetBytes(value);

        return bytes.Any(o => o.Equals(195)) ? Encoding.UTF8.GetString(bytes) : value;
    }
}

【问题讨论】:

    标签: c# oledb


    【解决方案1】:

    首先,您需要弄清楚您的文本文件使用什么编码。然后在连接字符串中指定文本编码。

    例如,这将是您的连接字符串,它还指定了 UTF-8 编码 (CharacterSet)。将UTF8 替换为您的文本文件使用的实际编码:

    string connectionString = string.Format(
        "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"{0}\\\";Extended Properties=\"Text;CharacterSet=UTF8;IMEX=1;FMT=Delimited\"",
        arquivo.DirectoryName
    );
    

    由于我使用 OleDB 是很久以前的事了,所以我不能确定 Microsoft.ACE.OLEDB 提供程序是否理解编码的名称,例如 UTF8、ISO-8859-1 等...如果它似乎不起作用,请尝试指定 codepage identifier of the encoding 而不是编码名称(例如,您可以指定“CharacterSet=65001”而不是“CharacterSet=UTF8” ")。

    【讨论】:

    • 您的编码可能是 ISO-8859-1 (msdn.microsoft.com/en-us/library/…)。我也来自巴西,我使用 UTF-8 得到了很多编码不匹配 ;)
    • 感谢@elgonzo 的帮助,但使用 CharacterSet 属性,该方法引发了以下异常:System.Data.OleDb.OleDbException: Invalid argument。如果我用过。正如我将在我的问题中描述的那样,我能够找到一种解决方法。
    • 很抱歉我的回答没能帮到你;但是我很高兴您仍然找到了解决方法。 :)
    • 感谢您提供有关代码页标识符的提示!这对我有用:CharacterSet=65001 for UTF-8
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 2017-10-02
    相关资源
    最近更新 更多