Как удалить символы спецификации (ï »¿) из CSV в кодировке UTF 8? - PullRequest
5 голосов
/ 07 июня 2011

Мне нужно проанализировать CSV в кодировке utf8. После конвертации я только что увидел, что проблема с символом спецификации (ï »¿) в begeing. Я не могу создать CSV, избегая спецификации с кодировкой utf8, так как мне нужно проанализировать ее, даже если она кодирована в utf8.

Любой, пожалуйста, скажите мне, как я могу удалить символ BOM (ï »¿) из csv, используя c # .net ..

Обновление : я добавил свой код для чтения заголовков csv, так как я получаю спецификацию в начале файла.

 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))
        {
            List<string> CSVHeaders = new List<string>();

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

            OdbcCommand Command = new OdbcCommand(SelectQuery, Connection);

            Connection.Open();

            OdbcDataReader Reader = Command.ExecuteReader(System.Data.CommandBehavior.CloseConnection);

            int ColumnCount = Reader.FieldCount;

            for (int column = 0; column < ColumnCount; column++)
            {
                CSVHeaders.Add(Reader.GetName(column));
            }

            return CSVHeaders;
        }

Ответы [ 3 ]

4 голосов
/ 07 июня 2011

На самом деле, C # может нормально читать файлы в кодировке UTF-8, содержащие спецификацию. Это поврежденный текстовый драйвер CSV, который вы используете, который на самом деле вызывает проблему. Я бы порекомендовал одно из других решений для чтения CSV из этого ответа .

2 голосов
/ 07 июня 2011

Вместо того, чтобы менять лошадей (использовать другой драйвер .csv) или помогать данной лошади, потянув повозку самостоятельно (измените кодировку), вы должны сообщить лошади (стандартный текстовый драйвер ODBC), что она должна знать для выполнения задание путем добавления файла schema.ini:

[withbomgood.txt]
Format=TabDelimited
ColNameHeader=True
CharacterSet=65001
Col1=FrsColümn CHAR

для определения формата withbomgood.txt:

FrsColümn
whätever

, которая является точной копией withbombad.txt; оба файла имеют спецификацию:

FrsColümn
whätever

Если вы сейчас вызываете слегка измененную копию

static void Harun00(string CSVFileName)
{
    string CSVFilePath = @"E:\trials\SoTrials\answers\6260911\data";
    string CSVConnectionString = 
        "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + 
        CSVFilePath +
        ";Extensions=asc,csv,tab,txt;Persist Security Info=False;";

    using (OdbcConnection Connection = new OdbcConnection(CSVConnectionString))
    {
        List<string> CSVHeaders = new List<string>();

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

        OdbcCommand Command = new OdbcCommand(SelectQuery, Connection);

        Connection.Open();

        OdbcDataReader Reader = Command.ExecuteReader(System.Data.CommandBehavior.CloseConnection);

        int ColumnCount = Reader.FieldCount;

        for (int column = 0; column < ColumnCount; column++)
        {
            CSVHeaders.Add(Reader.GetName(column));
        }

        Console.WriteLine(CSVHeaders[0]);
    }
}

вашего кода дважды:

static void Main(string[] args)
{
    Harun00("withbombad.txt");
    Harun00("withbomgood.txt");
}

вы получите:

FrsColümn
FrsColümn
Press any key to continue . . .

, который доказывает, что драйвер будет читать UTF8 с файлом спецификации правильно и без каких-либо дополнительных ADO, если вы следуете правилу: определите таблицы csv в файле schema.ini.

2 голосов
/ 07 июня 2011

Вот функция, которая делает это:

    public static void SaveAsUTF8WithoutByteOrderMark(string fileName)
    {
        SaveAsUTF8WithoutByteOrderMark(fileName, null);
    }

    public static void SaveAsUTF8WithoutByteOrderMark(string fileName, Encoding encoding)
    {
        if (fileName == null)
            throw new ArgumentNullException("fileName");

        if (encoding == null)
        {
            encoding = Encoding.Default;
        }

        File.WriteAllText(fileName, File.ReadAllText(fileName, encoding), new UTF8Encoding(false));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...