2015-04-01 2 views
0

Я пытаюсь прочитать файл с разделителями и проанализировать его содержимое. В отличие от CSV, разделитель, спецификатор строк и т. Д. Не являются ASCII, т.е. U0014 и U00FE соответственно. Однако я не могу определить символ спецификатора строки (FE). Это потому, что значение персонажа больше 128 или что-то еще?Идентификация и сопоставление символов не ascii в файлах

Вот простая программа, которая иллюстрирует основную проблему. Как я могу сделать эту работу? Вот ссылка на очень маленький тестовый файл. https://www.dropbox.com/s/1cilircwc3pq78c/nonascii.dat?dl=0

Благодаря

import org.apache.commons.io.FileUtils; 
import org.apache.commons.io.LineIterator; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStreamReader; 
import java.io.PrintStream; 
import java.io.Reader; 

public class CharMatch { 
    public static void main(String[] args) 
     throws Exception { 
    final String pathname = "/home/vinayb/Downloads/nonascii.dat"; 
    final File file = new File(pathname); 
    final String encoding = "UTF-8"; 
    final PrintStream out = new PrintStream(System.out, true, encoding); 
    final Reader r = new BufferedReader(new InputStreamReader(
      new FileInputStream(file), encoding)); 

    final LineIterator it = FileUtils.lineIterator(file, encoding); 
    try { 
     //read a line 
     final String line = it.nextLine(); 
     final char[] chars = line.toCharArray(); 
     for (char c : chars) { 
      out.println(c + " , with decimal value: " + Character.getNumericValue(c) + " and hexa value: " + Integer.toHexString(Character.getNumericValue(c))); 
     } 

     out.println("------------------------------------"); 
     final String expectedDelimiter = fromUnicode("0014"); 
     final String expectedStringQualifier = fromUnicode("00FE"); 
     out.println("##### expected delimiter:" + expectedDelimiter); 

     out.println("##### expected string qualifier:" + expectedStringQualifier); 
     String[] items = line.split(expectedDelimiter); 
     out.println("#### " + items.length + " " + items[0]); 

     if (line.contains(expectedDelimiter)) { 
      out.println("Found delimiter"); ////=======> can match this 
     } 

     if (line.contains(expectedStringQualifier)) { 
      out.println("Found string qualifier"); //=======> can't match this 
     } 
    } finally { 
     LineIterator.closeQuietly(it); 
    } 
} 

private static String fromUnicode(String codePoint) { 
    return "" + (char) Integer.parseInt(codePoint, 16); 
} 

}

+0

"символ последовательности символов"? И что это должно быть? – fge

+0

Это символ, используемый для классификации строк. Обычно используемым разделителем является «Например, в csv мы использовали разделители таким образом:« John Doe »,« 123, Main Street ». В этом случае разделителем является 00FE. См. Эту ссылку для того, что похоже на http : //en.wikipedia.org/wiki/ISO/IEC_8859-1 –

ответ

2

Ваш файл не является действительным UTF-8:

$ iconv -f utf-8 *dat >/dev/null; echo $? 
iconv: illegal input sequence at position 0 
1 

Но это может быть "читать", как ISO-8859-1:

$ iconv -f iso-8859-1 *dat >/dev/null; echo $? 
0 

Just chan ge кодирование на это; но такой формат файла в 2015 году довольно странный. То, что вы действительно должны сделать, это попросить источник таких файлов жить со временем;)

Обратите внимание, что поскольку первая последовательность байтов недопустима, по умолчанию Java заменит ее U+FFFD; и он будет делать это с каждой последовательностью байтов, которую он не может преобразовать в char с. Для того, чтобы Java генерировал исключение даже в этом случае, вам нужно создать экземпляр CharsetDecoder (из экземпляра Charset) и указать, что вы хотите .onMalformedInput(CodingErrorAction.REPORT) (по умолчанию CodingErrorAction.REPLACE).

+0

Я использовал формат ISO-8859-1, и это позволило мне прочитать файлы –

0

Посмотрите here. 00 FE может быть правильным кодом для UTF-16, но в UTF-8 это C3 BE. Это также может объяснить, почему это недопустимо UTF-8.

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

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