Прочитать содержимое файлов CSV внутри архива tar.gz - PullRequest
1 голос
/ 01 апреля 2019

Я хочу сохранить содержимое архива tar.gz в таблице базы данных.

Архив содержит текстовые файлы в формате CSV .

Идея состоит в том, чтобы вставить новую строку в базу данных для каждой строки в текстовых файлах.

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

Ниже EntryTable и EntryTableLine являются объектами Hibernate.

EntryTable находится в OneToMany с EntryTableLine (файл -EntryTable- может иметь много строк -EntryTableLine-).

public static final int TAB = 9;

FileInputStream fileInputStream = new FileInputStream(fileLocation);
GZIPInputStream gzipInputStream = new GZIPInputStream(fileInputStream);
TarArchiveInputStream tar = new TarArchiveInputStream(gzipInputStream);

BufferedReader reader = new BufferedReader(new InputStreamReader(tar));
// Columns are delimited with TAB
CSVFormat csvFormat = CSVFormat.TDF.withHeader().withDelimeter((char) TAB);
CSVParser parser = new CSVParser(reader, csvFormat);

TarArchiveEntry tarEntry = tar.getNextTarEntry();

while(tarEntry != null){
  EntryTable entryTable = new EntryTable();
  entryTable.setFilename(tarEntry.getName());

  if(reader != null){

     // Here is the problem
     for(CSVRecord record : parser){
        //this could have been a StringBuffer
        String line;
        int i = 1;
        for(String val : record){
           line = "<column" + i + ">" + val + "</column" + i + ">";
        }

        EntryTableLine entryTableLine = new EntryTableLine();
        entryTableLine.setContent(line);
        entryDao.saveLine(entryTableLine);
      }
  }
  tarEntry = tar.getNextTarEntry();
}

Я пытался преобразовать tarEntry.getFile () в InputStream , но tarEntry.getFile () , к сожалению, пусто.

Допустим, у меня есть 4 файла в архиве.Каждый файл имеет 3 строки внутри.Однако в базе данных некоторые записи имеют 5 строк, а другие - нет.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Попробуйте прочитать прямо из inputtream:

        BufferedReader br = null;
        while(tarEntry != null){
            br = new BufferedReader(new InputStreamReader(tarEntry));
0 голосов
/ 01 апреля 2019

Вы можете использовать TarArchiveInputStream из Apache Commons Compress, как показано ниже ( Ссылка ):

TarArchiveInputStream input = new TarArchiveInputStream(new GzipCompressorInputStream(new FileInputStream("C:\\Users\\User\\Desktop\\Books\\test\\CoverLetter-Version2.gz")));
TarArchiveEntry entry = input.getNextTarEntry();
System.out.println(entry.getName()); // prints the name of file inside the tar
BufferedReader br = null;
StringBuilder sb = new StringBuilder();
while (entry != null) {
    br = new BufferedReader(new InputStreamReader(input)); // Read directly from tarInput
    System.out.println("For File = " + currentEntry.getName());
    String line;
    while ((line = br.readLine()) != null) {
          System.out.println("line="+line);
    }
     entry = input.getNextTarEntry(); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...