Чтение из CSV с форматированными числами - PullRequest
0 голосов
/ 05 марта 2019

Процесс, который я хочу достичь, который я читаю из файла CSV и автоматически система создает новый файл CSV в другом формате.

Я могу прочитать и отформатировать файл CSV, однако у меня возникают проблемы с форматированием чисел, поскольку значения форматируются в тысячах (1000). Например, когда я читаю из CSV и разделяю каждую строку с помощью ',' мои значения меняются.

Пример строки 1: Название теста, Описание теста, Валюта теста, 12 500

var line1 = line.split (',');

Это разделяет значения 12 и 500 из-за разделителя. Как я могу получить номер в целом, пожалуйста?

  using (var reader = new StreamReader(openFileDialog1.FileName))
            {
                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine();
                    var values = line.Split(',');
                }
            }

Ответы [ 2 ]

3 голосов
/ 05 марта 2019

Ты не можешь.Когда CSV-файл содержит числа (или любой текст с, в нем), он должен заключить в кавычки поля.Простой код (т.е. не ИИ) невозможно отличить так, как это может сделать ваш человеческий глаз.

Пример строки 1: Название теста, Описание теста, Валюта теста, 12 500

Должно быть:

Пример строки 1: «ТестName "," Test Desc "," Test Currency "," 12,500 "

Общие парсеры / библиотеки CSV будут знать, как с этим справиться (например, CsvHelper )

Если у вас есть контроль над генерацией файла CSV, то вы должны внести это изменение.Если это от третьей стороны, то посмотрите, сможете ли вы заставить их внести изменения.

В вашем примере может быть крайний случай, если после полей всегда есть пробел, а не в числовых полях.Тогда ваш разделитель становится «,» вместо просто «,»

0 голосов
/ 05 марта 2019

Примечание:

Не следует использовать разделители, зависящие от культуры, в файле .csv, поскольку всегда приводит к головной боли при экспорте / импорте данных с другими региональными настройками.

Возможные решения:

  • Предлагаю сбросить и проанализировать числа (даты и т. Д.) С инвариантной культурой:

    myNumber.ToString(CultureInfo.InvariantCulture)

  • Если вам действительно нужно вывести числа с запятой, запишите их в кавычки. Это не превращает строки чисел, поскольку .csv не имеет информации о типе.

Excel против формата .csv

Еще одно замечание по Excel : обработка Microsoft .csv несколько сбивает с толку и противоречит RFC Standard . При экспорте .csv в Excel номера всегда сбрасываются с использованием региональных настроек. Чтобы избежать путаницы с разделителями, Excel использует другой символ (обычно точку с запятой) в качестве разделителя, если десятичный разделитель - запятая.

Используемый разделитель задается в качестве разделителя списка в региональных настройках операционной системы, а в .NET его можно получить с помощью свойства CultureInfo.TextInfo.ListSeparator.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...