2016-05-01 3 views
0

У меня возникла ситуация, когда мне нужно прочитать CSV-файл с байтами фиксированной ширины.Чтение фиксированной ширины Unicode CSV-файл с использованием java

Ниже мой пример формата CSV

ABCD EF日本  3456 0 
ABCD EF感じ日本 9345 1 

Мне нужно

AB,CD,,EF,日本,3456,,0 
AB,CD,,EF,感じ日本,9345,,1 

Проблема есть с японские символы являются многобайтовая он занимает 2 байта для каждого символа и, следовательно, фиксированная ширина логика не подать заявление.

Может ли какое-нибудь руководство сделать это с помощью java или есть какая-либо стандартная библиотека CSV, которую я могу использовать для нее.

Любые написанные сценарии или библиотеки будут оценены.

+1

Возможный дубликат [Что лучше всего разбирает файл с фиксированной шириной в Java?] (Http://stackoverflow.com/questions/1609807/whats -the-best-way-of-parsing-a-fixed-width-formatted-file-in-java) –

+0

@Menon, спасибо за указание ссылки на предлагаемое решение, я попытался с ними, но не сработал для многобайтовых символов, попросил пояснить тип входного формата, а также –

+0

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

ответ

0

Пример программа, которая разбивает строку по фиксированной ширине (вы можете добавить файл чтение & запятых к нему):

public class SplitStringIntoFixedSizeChunks { 

    public static String[] Split(String text, int chunkSize, int maxLength) { 
     char[] data = text.toCharArray();  
     int len = Math.min(data.length,maxLength); 
     String[] result = new String[(len+chunkSize-1)/chunkSize]; 
     int linha = 0; 
     for (int i=0; i < len; i+=chunkSize) { 
      result[linha] = new String(data, i, Math.min(chunkSize,len-i)); 
      linha++; 
     } 
     return result; 
    } 

    public static void main(String[] args) { 
     String x = "ABCD EF日本 3456 0 ABCD EF感じ日本 9345 1"; 
     //To Print length //System.out.println("x length: "+x.length()); 
     String[] lines = Split(x, 2, x.length()); 
     for (int i=0; i < lines.length; i++) { 
      System.out.print(lines[i]); 
      System.out.print(","); 
     } 
    } 
} 

Выход:

AB,CD, E,F日,本 ,34,56, 0, A,BC,D ,EF,感じ,日本, 9,34,5 ,1, 

Примечания: Если вы получаете "error: unmappable character for encoding ASCII" запустить export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8

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