Как определить локаль пользователя, чтобы получить правильный разделитель csv? - PullRequest
6 голосов
/ 11 ноября 2011

У меня есть простой инструмент преобразования данных, и один из выводов, который он может создать, - это файл csv.

Это прекрасно работает здесь, в Великобритании, но когда я отправил его немецкому клиенту, у меня возникли некоторые проблемы. В частности, они используют ',' для представления десятичной точки в числе с плавающей запятой и наоборот. Это означает, что когда они открывают свой файл данных в Excel, результат, по меньшей мере, довольно грязный: -)

Замена правильного символа тривиальна, но как я могу определить, применять это или нет?

Edit:

Итак, это:

a,b,c
1.1,1.2,1.3
"1.1",1,2,"1,3"
"this,is,multi-
-line",this should be column 2, row 4
a;b;c
"a;b","c"

.. выглядит так при загрузке в Excel в Великобритании:

+----------------+-----+-----+-----+
| a              | b   | c   |     |
+----------------+-----+-----+-----+
| 1.1            | 1.2 | 1.3 |     |
+----------------+-----+-----+-----+
| 1.1            | 1   | 2   | 1,3 |
+----------------+-----+-----+-----+
| this,is,multi- |     |     |     |
| -line          | 2   | 4   |     |
+----------------+-----+-----+-----+
| a;b;c          |     |     |     |
+----------------+-----+-----+-----+
| a;b            | c   |     |     |
+----------------+-----+-----+-----+

.. но что происходит в Германии?

Ответы [ 5 ]

12 голосов
/ 23 ноября 2015

Использование:

System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator

Запись CSV: строка «Разделитель списка» должна использоваться в качестве разделителей в CSV (см. Ниже о том, как изменить эту переменную). Изменение значения «Разделитель списка» также отражается в Excel при сохранении в формате CSV.

Чтение CSV: определение разделителя в CSV - это еще одна история, и она немного сложнее. В принципе, можно использовать «,» в качестве разделителя CSV в одной системе и использовать «;» или даже «*» или любой («строка») в качестве разделителя в другой системе: эта статья дает некоторое представление о том, как обнаружить разделители CSV при чтении файлов CSV между системами:

http://www.codeproject.com/Articles/231582/Auto-detect-CSV-separator.

Также вы можете выполнить некоторые тесты для вашего экспортера, изменив значение «Разделитель списков» в Windows следующим образом (может отличаться в зависимости от каждой ОС Windows):

  • Диалог открытия региона и языка.
  • Выберите на вкладке «Формат».
  • Нажмите «Дополнительные настройки»
  • Редактировать значение «Разделитель списка»
8 голосов
/ 03 декабря 2012

Поскольку другие упоминали, что CSV в общем случае должны быть разделены запятыми, а поля должны быть в двойных кавычках. Однако есть также специфическое поведение MS Excel, которое приводит к неправильному импорту правильного файла CSV. Это связано с тем, что в MS Excel по умолчанию используется разделитель списка, установленный в системе Windows в разделе «Язык и региональные стандарты». Для языка США / Великобритании это запятая, но для таких языков, как немецкий, это точка с запятой. Поэтому для MS Excel можно использовать разные разделители для каждой локали.

6 голосов
/ 11 ноября 2011

Свойство CurrencyDecimalSeparator содержит десятичный разделитель для данной культуры.При этом сепаратор CSV не зависит от культуры.Это свойство файла CSV, которое вы указываете парсеру.Говоря о парсерах, я искренне надеюсь, что вы не используете свой собственный CSV-парсер .

0 голосов
/ 11 ноября 2011

Как уже рекомендовано другими, формат не должен быть чувствительным к локали. Это верно для хранения (в файлах, таких как CSV или других форматах) или коммуникационных протоколов. Вы должны беспокоиться о чувствительности локали только для уровня представления. В противном случае это означает, что файл, сохраненный американским пользователем (например), не может быть загружен немецким (и наоборот).

Более подробные инструкции см. Здесь: http://mihai -nita.net / 2005/10/25 / data-internationalization /

0 голосов
/ 11 ноября 2011

CSV-файлы, как следует из названия, должны быть разделены запятыми и не зависеть от локальных. Однако, что вы можете сделать, чтобы избежать этой проблемы, это заключить в кавычки соответствующие десятичные числа в файле CSV следующим образом: "10,20", "1,50", "This is another column". Это должно полностью избежать проблемы для любого приличного парсера CSV (такого как FileHelpers библиотека), который будет читать это как 10,20 и 1,50, а не как: 10, 20, 1 и 50.

См. CSV :

Более сложные реализации CSV допускают запятые и другие специальные символы в значении поля. Многие реализации используют "(двойная кавычка) символы вокруг значений, которые содержат зарезервированные символы (такие как запятые, двойные кавычки или переводы строк); символы двойной кавычки может быть представлена ​​парой последовательных двойных кавычек

...