Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Reader с пропуском строки / 8 сообщений из 8, страница 1 из 1
11.04.2014, 09:01
    #38611990
daly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reader с пропуском строки
Есть задача распарсить CSV файл, в котором первой строкой идет хедр, второй типы данных, а уже потом сами данные.
Для парсинга использую opencsv. В нем есть замечательный метод CsvToBean.parse, который помимо прочего принимает на вход Reader.
Этот метод ожидает файл в котором есть только хедр и данные, а так как в моем файле второй строкой идут типы данных,
то при попытке паминга этой строки на бин вылетает ошибка.
Вопрос в том как мне создать какой-либо Reader, который бы игнорировал 2-ую строку?
...
Рейтинг: 0 / 0
11.04.2014, 12:44
    #38612214
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reader с пропуском строки
daly...Вопрос в том как мне создать какой-либо Reader, который бы игнорировал 2-ую строку?

А в чем проблема?
Посчитать переводы строк, ненужные строки выкинуть.
...
Рейтинг: 0 / 0
11.04.2014, 12:53
    #38612230
daly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reader с пропуском строки
Leonid Kudryavtsev,

каким образом из Reader'a выкинуть строки? мне нужно скоримть методу parse уже готовый Reader, который бы вернул те же самые данные за исключением второй строки...
...
Рейтинг: 0 / 0
11.04.2014, 13:05
    #38612243
For All
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reader с пропуском строки
Задача состоит из нескольких преобразований:
1. Поток символов из файла -> поток строк (построчно можно читать с помощью BufferedReader.readLine(), когда строки закончатся будет возвращать null)
2. поток строк -> отфильтрованый поток строк (пропускаем 2ю, все пустые и т.п.)
3. отфильтрованый поток строк -> поток символов

Поток строк можно представить в виде своей реализации Iterator (внутри имеет ссылку на BufferedReader)
Отфильтрованый поток - опять же Iterator (внутри ссылка на предыдущий Iterator и Filter - интерфейс с одним методом boolean accept(T value))
Поток символов из итератора проще сделать через свою реализацию InputStream (который потом завернуть в InputStreamReader чтобы ны выходе иметь ридер)
...
Рейтинг: 0 / 0
11.04.2014, 13:23
    #38612261
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reader с пропуском строки
Наследовать свой класс, переопределить методы.... В чем проблема?

1) Определить нужные строки (и выкинуть) - обычный конечный автомат. Вроде (я в институтах не учился) теорию конечных автоматов должны были преподавать. Т.ч. или конспекты (если учились ))) ) или книжки про конечные автоматы

2) Описания класса Reader
http://docs.oracle.com/javase/7/docs/api/java/io/Reader.html

Я бы переопределял посимвольный read(), а уже на основе его read(char[], int, int). Возможно будет не очень производительно (можно оптимальнее), но работать должно. С реализацией конечного автомата при посимвольном чтение проблем быть не должно.

3) Как это сейчас модно ))) можно использовать паттерны ))) Вроде, в данном случае, нужен паттер Decorator . Могу ошибаться, т.к. раньше никогда никакими паттернами не пользовался, просто писал код, не думаю, как это по умному называется )))


Я бы как-то так написал (это даже не код, просто пример)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
class MyReader extends Reader {
  Reader decoratedReader;
  int status; // тут будем хранить состояние конечного автомата, можно использовать enum 
  MyReader( Reader reader ) {
    decoratedReader = reader;
    status = 0;
  }
  // The only methods that a subclass must implement are read(char[], int, int) and close().
  close() {
    reader.close();
  }
  read(char....) {
    for (... ) {
       // ... посимвольно читаем в массив
    }
  }
  // Переопределяем посимвольное чтение и реализуем конечный автомат
  public int read() throws IOException {
     int ch;
m1:
     ch = decoratedReader.read();
     // Конец файла
     if ( ch < 0 )
        return ch;
     // Анализируем пришедший символ (перевод строки, перевод каретки или просто символ)
     switch ( ch ) {
        ... обработка символов и изменение состояния конечного автомата....
     }
     if ( status == <вторая_строка_и_игнорировать> ) {
        // Игнорируем и просто считываем следующий символ. Можно и без goto написать )))
        goto m1;
     }
     return ch;
  }
}




Можно посмотреть на сорцы стандартных классов. Но если задача вызывает проблемы, то одно из:
1) прочитать книжку про конечные автоматы
2) пойти учиться
3) выпить йаду или убиться ап стенку )))
IMHO

P.S.

1. сорри если не вежлив я и так по жизни злой, а вчера вечером еще и с девушкой поссорился
2. а последние N-месяцев пытаюсь XML с помощью ГОСТ электронной подписи подписать. Зла на некоторых Java писателей и придумывателей стандартов не хватает.
...
Рейтинг: 0 / 0
11.04.2014, 13:33
    #38612275
For All
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reader с пропуском строки
Leonid Kudryavtsev2) Я бы переопределял посимвольный read(), а уже на основе его read(char[], int, int). Возможно будет не очень производительно (можно оптимальнее), но работать должно. С реализацией конечного автомата при посимвольном чтение проблем быть не должно.


Поэтому проще сделать свой InputStream - там только один метод переопределить надо: int read().
Потом уже этот InputStream завернуть в InputStreamReader, если нужен именно Reader на выходе
...
Рейтинг: 0 / 0
11.04.2014, 13:40
    #38612289
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reader с пропуском строки
http://docs.oracle.com/javase/6/docs/api/java/io/FilterReader.htm
мониторим \n и скипаем вторую строку.
...
Рейтинг: 0 / 0
11.04.2014, 15:24
    #38612487
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reader с пропуском строки
Задача красиво решается в Linux через

Код: powershell
1.
$ tail -n



и через игры STDIN/PIPES
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Reader с пропуском строки / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]