2015-04-28 2 views
0

Я хочу прочитать простой CSV файл запятой с этим кодом:
Как я могу читать персидскую строку в CSV файл C#

var reader = new StreamReader(File.OpenRead(@"d:\34.csv")); 


List<string> listA = new List<string>(); 
     List<string> listB = new List<string>(); 
     while (!reader.EndOfStream) 
     { 
      var line = reader.ReadLine(); 
      var values = line.Split(','); 

      listA.Add(values[0]); 
      listB.Add(values[1]); 
     } 
     MessageBox.Show("READ IT!!!"); 

Но когда я прочитал Файловый отладить этот код, внимание не может читать персидский или арабский характер! Как я могу это решить? Я думаю, что мой файл недействителен для кодировки?

+0

'читатель вар = новый StreamReader (File.OpenRead (@ "d: \ 34.csv"), Encoding.Unicode); 'вы пробовали Unicode? – fubo

+2

Не могли бы вы поставить персидский файл csv, чтобы мы могли проверить его сами? –

ответ

0

если ваш файл CSV содержит только одну строку ReadToEnd может быть приемлемым, но если у вас есть файл журнала, состоящий более чем одной линии, то это лучше строку читать строки с помощью ReadLine объекта StreamReader

link for true answer and more information

using (StreamReader sr = new StreamReader("c:/temp/34.csv")) 
    { 
     string currentLine; 
     // currentLine will be null when the StreamReader reaches the end of file 
     while((currentLine = sr.ReadLine()) != null) 
     { 
      // Search, case insensitive, if the currentLine contains the searched keyword 
      if(currentLine.IndexOf("I/RPTGEN", StringComparison.CurrentCultureIgnoreCase) >= 0) 
      { 
       Console.WriteLine(currentLine); 
      } 

     } 
    } 

More information

+0

Ibrahim ne soylosan? В моем файле используется персидский символ, но когда прочитано, что я вижу этот символ: 1393, \ "1393,01,01 \", \ "1393,03, 01 \ " –

+0

Шестнадцатеричный код: FFFD 000A 000A, Шестнадцатеричные NCR: & # xFFFD; –

0

Вы можете создать класс, состоящий из получить и установить для каждой строки CSV. Затем вы можете создать экземпляр списка объектов для извлечения строк CSV. Попробуйте так:

class Program 
{ 

static void Main(string[] args) 
{ 

var reader = new StreamReader(File.OpenRead(@"YourCSV"),Encoding.Unicode); 

List<Customer> customer = new List<Customer>(); 

while (!reader.EndOfStream) 
{ 
    Customer c = new Customer 
    { 
     m_line1 = null, 
     m_line2 = null, 
    }; 

    var line = reader.ReadLine(); 
    var tokens = line.Split(','); 

    c.m_line1 = tokens[0]; 
    c.m_line2 = tokens[1]; 
    customer.Add(c); 

} 

    foreach(var s in customer) 
    { 
     Console.Writline(s); 
     Console.Readline(); 
    } 
} 
} 



class Customer 
{ 
    private string line1; 
    public string m_line1 
    { 
    get 
    { 
    return line1; 
    } 

    set 
    { 
    line1= value; 
    } 
} 

private string line2; 
public string m_line2 
{ 
    get 
    { 
    return line2; 
    } 

    set 
    { 
    line2= value; 
    } 
} 
0

Вы должны будете пройти кодировку в StreamReader конструктора. Существует нет такой вещи, как простой текст. Чтение текста требует зная его кодировку.

Линия

using (StreamReader sr = new StreamReader("c:/temp/34.csv")) 

должен быть

using (StreamReader sr = new StreamReader("c:/temp/34.csv"), myencoding) 

, что myencoding есть что-то только вы можете знать. С какими кодировками был сохранен файл? Это кодировка, в которой вы нуждаетесь. Если файл был сгенерирован в Windows, и получить обоснованное предположение о наиболее вероятной кодировке будет UTF-16LE. Эта кодировка доступна как Encoding.Unicode - это плохое имя, оно должно было быть Encoding.UTF16LE, но это имя использует .NET framework.

Другие возможные кодировки, которые поддерживаются StreamReader перечислены на https://msdn.microsoft.com/en-us/library/System.Text.Encoding_properties(v=vs.110).aspx

Если вы не знаете, с какой кодировке файл был сохранен, некоторые кодировок оставить подсказки в виде Byte order mark иногда сокращенно BOM. Знак байтового байта - это первые несколько байтов текстового документа, которые сообщают вам его кодировку.Вы можете найти более подробную информацию о метка порядка байт, и некоторые из его значений на http://en.wikipedia.org/wiki/Byte_order_mark

Опираясь на спецификации, как правило, плохая идея, потому что

  • это не полное доказательство решения: некоторые кодировки дон используйте спецификацию или внесите спецификацию.
  • Даже если вы успешно определили кодировку, это не означает, что StreamReader знает, как обрабатывать эту кодировку (хотя это маловероятно, но возможно)
  • Спецификация может не быть спецификацией вообще, но быть частью фактического текста (также маловероятным, но возможно)

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

ТЛ; др: Наиболее вероятно, что на работу является одним из

using (StreamReader sr = new StreamReader(File.OpenRead(@"c:/temp/34.csv"),Encoding.Unicode) { 
    ... 
} 

или

using (StreamReader sr = new StreamReader(File.OpenRead(@"c:/temp/34.csv"),Encoding.UTF8) 

или

using (StreamReader sr = new StreamReader(File.OpenRead(@"c:/temp/34.csv"),Encoding.UTF32) 
Смежные вопросы