2013-12-12 1 views
2

Сегодня я узнал, почему эта проблема возникает или как эта проблема возникает при чтении строки за строкой из текстового файла с использованием C# ReadLine().ReadLine() не удалось прочитать целую строку

Проблема:

Предположим, есть 3 строки в текстовом файле. Каждый из которых имеет длину равную 400. (вручную подсчитывается) при чтении строки из C# ReadLine() и проверки длины в Console.WriteLine (str.length); я узнал, что она печатает:

Line 1 => 400 
Line 2 => 362 
Line 3 => 38 
Line 4 => 400 

Я был смущен и что текстовый файл имеет только три строки, почему его печать 4, что тоже с длиной изменилась. Затем я быстро проверил «\ n» или «\ r» или комбинацию «\ r \ n», но я не нашел их, но я обнаружил, что во второй строке было 2 двойных кавычки ex => «abcd».

Затем я изменил код, чтобы напечатать строки себя и мальчик я был Amaze, я получаю выход в консоли как:

Line 1 > blahblahblabablabhlabhlabhlbhaabahbbhabhblablahblhablhablahb 
Line 2 > blablabbablablababalbalbablabal"blabablhabh 
Line 3 > "albhalbahblablab 
Line 4 > blahblahblabablabhlabhlabhlbhaabahbbhabhblablahblhablhablahb 

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

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

static void Main(string[] args) 
{ 

    FileStream fin; 
    string s; 
    string fileIn = @"D:\Testing\CursedtextFile\testfile.txt"; 

    try 
    { 
     fin = new FileStream(fileIn, FileMode.Open); 
    } 
    catch (FileNotFoundException exc) 
    { 
     Console.WriteLine(exc.Message + "Cannot open file."); 
     return; 
    } 

    StreamReader fstr_in = new StreamReader(fin, Encoding.Default, true); 

    int cnt = 0; 

    while ((s = fstr_in.ReadLine()) != null) 
    { 
     s = s.Replace("\""," "); 
     cnt = cnt + 1; 
     //Console.WriteLine("Line "+cnt+" => "+s.Length); 
     Console.WriteLine("Line " + cnt + " => " + s); 
    } 

    Console.ReadLine(); 
    fstr_in.Close(); 
    fin.Close(); 
} 

Примечания: я пытался читать и загружать 37 текстовые файлы по 500 Мб каждый из области финансов, где я всегда сталкиваюсь с этим вопросом и должен вручную делать изменения. :(

+8

Вы уверены, что выбор кодировки верен? – Jon

+0

Я предлагаю вам эту строку иначе: while ((s = fstr_in.ReadLine())!= null) Попробуйте что-то вроде: using (StreamReader fstr_in = new StreamReader (fileIn)) \t { \t line = fstr_in.ReadLine(); \t} – NoChance

+2

Котировки - это красная сельдь. Там просто символ линии/символ новой строки (или что-то интерпретируется как оно) в позиции, где строка 2 неверно переходила к строке 3. @Jon на что-то с кодировкой. Если вы выбрали неправильную кодировку, то что-то, что должно было быть прочитано вместе с предыдущим или следующим байтом, чтобы повлиять на персонажа, теперь читается как персонаж сам по себе, и, случается, это то, что ломает линию. –

ответ

0

Если проблема заключается в том, что:

  • Собственные разрывы строк должна быть комбинацией новой строки (10) и возврата каретки (13)
  • Одинокие перевода строки и/или возврат каретки являются неправильно интерпретируется как разрыв строки

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

Однако вот LINQPad программы, которая заменяет одиночка новой строки или возврат каретки с пробелами:

void Main() 
{ 
    string input = "this\ris\non\ra\nsingle\rline\r\nThis is on the next line"; 
    string output = ReplaceLoneLineBreaks(input); 

    output.Dump(); 
} 

public static string ReplaceLoneLineBreaks(string input) 
{ 
    if (string.IsNullOrEmpty(input)) 
     return input; 

    var result = new StringBuilder(); 

    int index = 0; 
    while (index < input.Length) 
    { 
     switch (input[index]) 
     { 
      case '\n': 
       if (index == input.Length - 1 || input[index+1] != '\r') 
       { 
        result.Append(' '); 
        index++; 
       } 
       else 
       { 
        result.Append(input[index]); 
        result.Append(input[index + 1]); 
        index += 2; 
       } 
       break; 

      case '\r': 
       if (index == input.Length - 1 || input[index+1] != '\n') 
       { 
        result.Append(' '); 
        index++; 
       } 
       else 
       { 
        result.Append(input[index]); 
        result.Append(input[index + 1]); 
        index += 2; 
       } 
       break; 

      default: 
       result.Append(input[index]); 
       index++; 
       break; 
     } 
    } 
    return result.ToString(); 
} 
0

Если линии все те же длинами, расщепленных линий по их длине, а не смотреть на конец строк ,

const int EndOfLine = 2; // CR LF or = 1 if only LF. 
const int LineLength = 400; 

string text = File.ReadAllText(path); 
for (int i = 0; i < text.Length - EndOfLine; i += LineLength + EndOfLine) { 
    string line = text.Substring(i, Math.Min(LineLength, text.Length - i - EndOfLine)); 
    // TODO Process line 
} 

Если последняя строка не завершается концом строки символов, удалите два - EndOfLine. Также часть Math.Min является только мерой безопасности. Это может быть необязательно, если строка не короче 400.