Как преобразовать DataTable в CSV без проблем с кодировкой - PullRequest
0 голосов
/ 08 октября 2019

У меня есть код, который преобразует DataTable в файл CSV. В этом нет проблем. Но когда я смотрю в файл CSV, некоторые турецкие символы (ISO-8859-9) кажутся неправильными. Я должен решить проблему кодирования;

StringBuilder sb = new StringBuilder();

        IEnumerable<string> columnNames = dt.Columns.Cast<DataColumn>().
                                          Select(column => column.ColumnName);
        sb.AppendLine(string.Join(",", columnNames));

        foreach (DataRow row in dt.Rows)
        {
            IEnumerable<string> fields = row.ItemArray.Select(field =>
              string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\""));
            sb.AppendLine(string.Join(",", fields));
        }

        File.WriteAllText("Gecisler" + Tarih + ".csv", sb.ToString());

1 Ответ

0 голосов
/ 27 октября 2019

Вместо того, чтобы «катить» свой собственный писатель CSV, я рекомендую использовать библиотеку Pnyx . Он изящно обрабатывает кодирование файлов, новые строки Unix / Windows и RFC 4180 форматирование CSV.

Вот пример использования его свободного API (замените some_xxx фактическими значениями):

        string Tarih = "some_value";
        DataTable dt = some_data();

        using (Pnyx p = new Pnyx())
        {
            p.setSettings(outputEncoding: Encoding.GetEncoding(some_encoding()));
            p.readRowFunc(
                source: () => dt.Rows.Cast<DataRow>().Select(dataRow => dataRow.ItemArray.Select(obj => obj.ToString()).ToList()),
                header: () => dt.Columns.Cast<DataColumn>().Select(column => column.ColumnName).ToList()
            );
            p.writeCsv("Gecisler" + Tarih + ".csv");
        }

Полное раскрытие: я сотрудник библиотеки.

...