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

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

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

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

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
Reader с пропуском строки
    #38612275
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev2) Я бы переопределял посимвольный read(), а уже на основе его read(char[], int, int). Возможно будет не очень производительно (можно оптимальнее), но работать должно. С реализацией конечного автомата при посимвольном чтение проблем быть не должно.


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

Код: powershell
1.
$ tail -n



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


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