Использование Java для чтения и обработки текстового файла с пользовательскими разделителями столбцов и строк - PullRequest
2 голосов
/ 01 декабря 2011

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

| NEWTAB | lkfalskdjlskjdflsj | NEWTAB | lkjsldkjslkdjf | NEWTAB | sdlfkjsldkjf | NEWLINE | lksjlkjsdl | NEWTAB | lkjlkjlkj | NEWTAB | sdkjlkjsld

1004 * | NEWLINE |указывает начало новой строки (т. е. новой строки в данных) | NEWTAB |указывает начало нового поля в строке (т. е. новый столбец в данных)

Мне нужно разбить текстовый файл на поля и строки и сохранить их в массиве или какой-либо другой структуре данных.Контент между | NEWLINE |строки могут содержать фактические новые строки (т.е. \ n), но они не указывают на фактическую новую строку в данных.

Я начал с чтения каждого символа по одному и просмотра наборов из 8 последовательных символовчтобы увидеть, если они содержали | NEWTAB |.Мой метод оказался ненадежным и безобразным.Я ищу лучшую практику по этому вопросу.Будет ли лучший способ прочитать весь текстовый файл как одну строку, а затем использовать строку, разделенную на "| NEWLINE |"и затем строка разбивается на результирующие строки, используя "| NEWTAB |"?

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

Я думаю, что другие ответы тоже будут работать, но мое решение таково:

FileReader inputStream = null;
StringBuilder builder = new StringBuilder();

try {
    inputStream = new FileReader(args[0]);
    int c;
    char d;

    while ((c = inputStream.read()) != -1) {
        d = (char)c;
        builder.append(d);
    }
} 

finally {
    if (inputStream != null) {
        inputStream.close();
    }
}   

String myString = builder.toString();

String rows[] = myString.split("\\|NEWLINE\\|");

for (String row : rows) {
    String cols[] = row.split("\\|NEWTAB\\|");

    /* do something with cols - e.g., store */
}
1 голос
/ 01 декабря 2011

Вы могли бы сделать что-то вроде этого:

Scanner scanner = new Scanner(new File("myFile.txt"));

List<List<String>> rows = new ArrayList<List<String>>();
List<String> column = new ArrayList<String>();

while (scanner.hasNext()) {

    for (String elem : scanner.nextLine().split("\\|")) {

    System.out.println(elem);

    if (elem.equals("NEWTAB") || elem.equals(""))
        continue;
    else if (elem.equals("NEWLINE")) {
        rows.add(column);
        column = new ArrayList<String>();
    } else
        column.add(elem);
    }       
}

Мне потребовалось время, чтобы написать это, поскольку у меня нет IntelliJ или Eclipse на этом компьютере, и мне пришлось использовать Emacs.

РЕДАКТИРОВАТЬ: Это немного более многословно, чем мне нравится, но это работает с | с, которые являются частью текста:

Scanner scanner = new Scanner(new File("myFile.txt"));
List<List<String>> rows = new ArrayList<List<String>>();
List<String> lines = new ArrayList<String>();
String line = "";

while (scanner.hasNext()) {     
    line += scanner.nextLine();
    int index = 0;      
    while ((index = line.indexOf("|NEWLINE|")) >= 0) {
        lines.add(line.substring(0, index));
        line = line.substring(index + 9);       
    }       
}

if (!line.equals(""))
    lines.add(line);

for (String l : lines) {
    List<String> columns = new ArrayList<String>();
    for (String column : l.split("\\|NEWTAB\\|"))
        if (!column.equals(""))
            columns.add(column);
    rows.add(columns);
}
...