jessiefun Ответов: 3

Экспорт данных в csv файл из базы данных содержащей Юникод


Есть некоторые проблемы, когда я хочу экспортировать данные в csv-файл:
public void ExportLoalDataToCSV(DataTable dt, string fileName)
{
    FileStream fs = new FileStream(fileName, FileMode.Create);
    StreamWriter sw = new StreamWriter(fs, Encoding.Unicode);
    IEnumerable<string> query = (from row in dt.AsEnumerable()
                                 select row.Field<string>("ID") + "," + row.Field<string>("Text")).Distinct();
    foreach (string row in query)
    {
        string[] temp = row.Split(',');
        foreach (string item in temp)
        {
            sw.Write(item + ",");
        }
    }
    sw.Close();
}

в то время как если row.Field<string>("Text") содержит а ',', там будет еще одна дополнительная колонка, которая не является моей ожидаемой. :(
(Из кода я просто хочу получить 2 столбца, идентификатор и текст)
Есть ли какой-нибудь способ решить эту проблему?

Большое спасибо.
Джесси

3 Ответов

Рейтинг:
2

JOAT-MON

Вы можете попробовать обернуть свои строки в цитаты:

IEnumerable<string> query = 
(
     from row in dt.AsEnumerable()
     select row.Field<string>("ID") 
          + ", \""
          + row.Field<string>("Text") 
          + "\""
).Distinct();


Кроме того, поскольку вы включаете запятую в свой запрос выбора, я не думаю, что вам нужно будет разбивать строку перед ее написанием.


Рейтинг:
1

Michael Haephrati

Решение, которое я нашел для подобных проблем, состояло в том, чтобы вставить символ спецификации в файл .CSV-файл для указания его кодировки.
CSV и символ спецификации - CSV[^]
Если бы вы даже вставили символ юникода в файл блокнота и попытались сохранить его, вы бы увидели предупреждение о том, что содержимое файла будет потеряно, то же самое происходит и с файлом .CSV, который в целом является обычным текстовым файлом. Кодировка по умолчанию-ASCII, и вам нужно изменить ее на UTF-8.


Richard Deeming

Добавление спецификации в файл не изменит того факта, что запятая в строке без кавычек по-прежнему будет рассматриваться как разделитель, разделяющий поле на два.

А какой фильтр вы используете в списке вопросов, если сверху появился вопрос из 2010 года?!

Michael Haephrati

Ричард, я сообщил об этом как об ошибке https://www.codeproject.com/suggestions.aspx?msg=5475847#xx5475847xx-да.
Эти вопросы появились в верхней части моего списка!
Пожалуйста, смотрите мой скриншот 2018-01-12__7_.png (549,9 КБ)
Как вы можете видеть, этот вопрос появляется в верхней части моего списка, и единственными фильтрами, которые я вижу, являются: "активный" (поэтому этот вопрос все еще помечен как активный) и "Юникод"

Richard Deeming

Ну, он появляется в верхней части вашего списка сейчас потому что он был обновлен вашим ответом. :)

Не похоже, что вопрос был отредактирован, и, похоже, не было никаких решений, которые были бы удалены, что является основной причиной, по которой он появился бы в списке "последние".

Если он показывался на первых нескольких страницах списков "активных" или "неотвеченных" до вашего ответа, то я подозреваю, что там может скрываться ошибка.

Michael Haephrati

.. и все же я получил его в первую очередь. Я определенно не искал старых вопросов

Richard Deeming

Определенно похоже на жука.

Patrice T

Просто интересно. Планируете ли вы ответить на все старые вопросы, которые появляются в верхней части списка?
В ваших последних 6 ответах 5 вопросов относятся к возрасту около года.
Вы должны проверить даты вопросов, прежде чем публиковать ответ.

Michael Haephrati

Если я нахожу их интересными, то да!

Patrice T

Я думаю, вы знаете, что получите downvotes.

Michael Haephrati

Спасибо за предупреждение... Нет ничего плохого в том, чтобы отвечать на старые вопросы. Если вы считаете, что эти вопросы не должны быть там, удалите их.

Patrice T

Когда автор не приходил сюда ни разу за 8 лет, можно поспорить, что он даже не помнит, как задавал этот вопрос, и ваш ответ тоже не принесет пользы.

Michael Haephrati

Да, я согласен. Я, конечно, не ищу старые вопросы, и, похоже, есть ошибка, о которой я сообщил. Я проверю дату вопросов, прежде чем ответить на них.

Рейтинг:
0

ARopo

Либо придумайте escape-последовательность для запятой , например &comma& затем замените ее на, после разделения.

или поместите каждое поле в "кавычки" и проанализируйте строку, чтобы игнорировать запятые между кавычками

или используйте более маловероятный символ для разделения ваших полей, например ^ вместо запятой