使用OleDbConnection从文本文件中读取特殊字符

时间:2015-08-14 22:30:33

标签: c# oledb

我在使用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;
    }
}

1 个答案:

答案 0 :(得分:1)

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

例如,这将是您的连接字符串,它也指定UTF-8编码(<table ng-table="tableParams" class="table"> <tr ng-repeat="w in $data"> <td data-title="'ID'"> ... )。将CharacterSet替换为文本文件使用的实际编码:

UTF8

因为我使用OleDB已经有一段时间了,所以我无法确定Microsoft.ACE.OLEDB提供商是否理解UTF8,ISO-8859-1等编码的名称......如果它似乎不起作用,尝试指定codepage identifier of the encoding而不是编码名称(例如,而不是&#34; CharacterSet = UTF8 &#34;您将指定&#34 ; CHARACTERSET = 65001 &#34;。)