2015-07-22 3 views
3

У меня есть два текстовых файла - они оба содержат одну и ту же информацию, но доступны в двух разных форматах.Дифференциация между двумя текстовыми файлами, имеющими один и тот же контент, но в другом формате с использованием программы C#

Формат 1 имеет разрывы строк и выглядит хорошо отформатированным. Формат 2 «кажется» непрерывным, но на самом деле он также имеет разрывы строк, но разрыв строки представляется очень странным образом.

https://www.dropbox.com/sh/ljlqen94a5cwza2/AAAOcuYU_EDnSLiNPRP_CDbga?dl=0

Пожалуйста, обратитесь к отсоединяемым (LineBreak.dat и NoLineBreak.dat) В последнем файл, есть разрывы строк, но не видны - выглядит как какое-то преобразование на данном изменились представление , Если вы начнете отсчет с первой позиции (начните отсчет с i = 0), используя правый курсор на клавиатуре, то при i = 19 вы обнаружите, что курсор застревает для одного нажатия - вам нужно дважды нажать, чтобы перейти к следующему должность. Это происходит во многих местах документа - я понял, что это места, где были разрывы строк, которые теперь были повреждены.

В моем сценарии делового случая последний тип файла считается недействительным. Поэтому мне нужно написать программу C# для определения типа файла - если это в формате 1 или Format2 и вам нужна помощь.

Я попытался выяснить, отличается ли кодировка от них, прочитав спецификацию, но то же самое в обоих файлах. Я получил следующие спецификации показания: [0]: 57 [1]: 57 [2]: 48 [3]: 54

Я использую следующую программу для обнаружения кодирования:

public static void GetEncoding(string pFilePath,out Encoding pFileEncoding) 
{ 
    // Read the BOM 
    var bom = new byte[4]; 
    using (var file = new FileStream(pFilePath, FileMode.Open, FileAccess.Read)) 
    { 
     file.Read(bom, 0, 4); 
    } 

    // Analyze the BOM 
    if (bom[0] == 0x2b && bom[1] == 0x2f && bom[2] == 0x76) pFileEncoding = Encoding.UTF7; 
    if (bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf) pFileEncoding= Encoding.UTF8; 
    if (bom[0] == 0xff && bom[1] == 0xfe) pFileEncoding =Encoding.Unicode; //UTF-16LE 
    if (bom[0] == 0xfe && bom[1] == 0xff) pFileEncoding= Encoding.BigEndianUnicode; //UTF-16BE 
    if (bom[0] == 0 && bom[1] == 0 && bom[2] == 0xfe && bom[3] == 0xff) pFileEncoding= Encoding.UTF32; 
    pFileEncoding= Encoding.ASCII;//or Encoding.Default 
} 

ответ

1

ФОРМАТ2 файла не поврежден; он просто имеет разрывы строк в стиле unix (просто строка или \n) в конце каждой строки. В другом файле есть разрывы строк в формате Windows (возврат каретки с последующим переводом строки или \r\n).

Вы можете легко исправить последние файлы, проверив существование \r, и если в файле не существует файла, выполните string.Replace("\n", "\r\n") по всему файлу.

+0

Проверка работы \ r. Только один из типов файлов имеет это, и я могу легко его пометить. В ретроспективе я, вероятно, должен был использовать более мощный редактор, чтобы сначала изучить файлы ... – Sandeep

0

Если вы открываете текстовый файл в «мощном» текстовом редакторе, таком как Notepad ++, вы можете видеть каждый отдельный байт в вашем файле, даже если это «пробел», т.е. не отображается в «обычных» текстовых редакторах.

В вашем случае вы обнаружите, что разрывы строк являются символами «Linefeed» ('\ n', Dec 10, Hex 0x0A). Это обычный способ представления «Новой линии» в Unix-системах.

Если вы хотите пометить такие файлы как «недействительные», просто выполните поиск символов возврата каретки ('\ r', dec 13 Hex 0x0D) и символов «Linefeed».

В окнах текстовых файлов вы найдете 0x0D/0x0A Пары

В Unix Files 0x0a только

В компании Apple Files 0x0D только

(Все это не имеет ничего общего с кодировками)

+2

Notepad ++ - это не программа на C#, которая определяет тип файла. – ntohl

1

Два файла имеют разные стили Linebreaks - вы можете использовать замену строки в одном из файлов, чтобы сделать это одинаковым. Попытайтесь посмотреть на https://superuser.com/questions/545461/replace-carriage-return-and-line-feed-in-notepad Для того, чтобы сделать это вручную, но вы можете сделать это в коде C#, а просто замените \ n на \ r \ n.

Если вы хотите быть уверен, что он будет работать везде, где вы можете заменить \ п и \ г \ п с Environment.NewLine

Надеется, что это помогает :)

+0

Файлы OP имеют '\ n', поэтому ему нужно заменить' \ n' на '\ r \ n' i.e. Linefeed -> Return of Carriage + Linefeed – DrKoch

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

  • Нет связанных вопросов^_^