2016-06-10 5 views
1

Я пишу программу, которая должна помочь выполнить вычисления в зависимости от файла, который пользователь импортирует (входной файл csv).Информация о вводе информации о культуре C#

Для расчетов правильны. Я заставляю программу работать с культурой «en-US».

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US"); 
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-US"); 

Я прочитал входной файл, что путь

using (StreamReader sr = new StreamReader("C:\\data.csv")) 
      { 
       while ((currentLine = sr.ReadLine()) != null) 
       { 
        var values = currentLine.Split(';'); 

         string a = values[0]; 
         string b = values[1]; 
         string c = values[2]; 
         string d = values[3]; 
         string e = values[4]; 
         string f = values[5]; 
         string g = values[6]; 
         string h = values[7]; 
         string i = values[8]; 
         string j = values[9]; 
         string k = values[10]; 
        } 
       } 

Мое беспокойство в том, что я не знаю, запись языка входного файла, может быть, это культура «FR - FR» и у меня есть для обеспечения того, чтобы разделитель данных, десятичный соответствующий язык «en-US». Не могли бы вы объяснить мне, как определить язык входного файла или как его преобразовать, чтобы сделать его совместимым с языком «en-US»

+0

Рассмотрите, с чего начинается исходный файл. Можете ли вы что-нибудь сделать, когда файл создан, например, включить культуру в имя файла или в первую строку? –

+0

Я не могу, пользователь делает файл с Excel. Его полностью прозрачный для него –

ответ

0

Я нашел решение. Мой входной файл представляет собой файл с 10 столбцами с первой строкой заголовка. Пользователь должен написать в первом ряду:

LABEL1 LABEL2 и т.д ... до 10

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

test - первая строка файла, считываемого с использованием StreamReader. Я сохраняю первую строку в строке.

Console.WriteLine(test.Between("LABEL1", "LABEL2")); 

И теперь, я знаю, если это «;» разделитель, я заменю каждый "," на "." и если разделитель является «,», мне не нужно заменять какой-либо десятичный разделитель, потому что его уже «.» и т. д. для любого разделителя ...

С уважением

+0

Вы должны быть осторожны с таким преобразованием, чтобы не заменить точку запятой в тексте, например. Для чисел вы можете указать культуру, используемую для синтаксического анализа строки. Это будет работать лучше с номером больше или равным 1000, поскольку Excel может добавлять разделители тысяч в файл csv. (https://en.wikipedia.org/wiki/Decimal_mark#Digit_grouping) –

1

Прежде всего, формат CSV не имеет строгого отношения к культуре. Общие разделители (или ,), разделители (") не связаны с культурой, хотя некоторые инструменты, такие как Excel, используют , для версии в США (которые могут быть изменены в любом случае) и ; для fr-FR.

Лучшим способом работы с этими файлами является установление контракта («Библиотека обрабатывает файлы CSV со следующим форматом:») или принимает некоторую конфигурацию для правильной обработки файла.

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

Это та же самая проблема, с которой можно столкнуться при попытке выяснить, какая кодировка используется в файле (у вас также может быть такая проблема, CSV-файл может быть закодирован, например, UTF-8 или ANSI).

(BTW, Excel - это ужасный инструмент для обработки CSV-файлов, он обрезает данные и делает другие странные вещи. Access обрабатывает файлы CSV гораздо лучше, но люди склонны использовать Excel).

+0

Да входной файл имел 10 столбцов и X строк. И если я создаю окно с текстовым блоком с содержимым входного файла.И текстовое поле для ввода разделителя столбцов, после чего я могу определить десятичный разделитель (если пользователь вводит «;» как разделитель столбцов каждый, является десятичным разделителем, я должен заменить каждый «,» на «.» И удалить "?"? –

Смежные вопросы