为了账号安全,请及时绑定邮箱和手机立即绑定

读取 tar.gz存档中的 CSV 文件的内容

读取 tar.gz存档中的 CSV 文件的内容

撒科打诨 2022-09-14 15:25:31
我想将 tar.gz 存档的内容保存在数据库表中。存档包含 CSV 格式的 txt 文件。我们的想法是在数据库中为txt文件中的每一行插入一个新行。问题是我无法单独读取文件的内容,然后转到下一个文件。“入口表”和“入口表格”下方是休眠实体。入口表与入口表格线处于一到很多关系(一个文件 -条目表- 可以有许多行 -入口表格-)。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 TABCSVFormat 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 行,而其他条目没有。
查看完整描述

3 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

执行类似操作解决了问题:

TarArchiveEntry entry = tarInput.getNextTarEntry();byte[] content = new byte[entry.getSize()];
LOOP UNTIL entry.getSize() HAS BEEN READ {
    tarInput.read(content, offset, content.length - offset);
}

评论中提到的参考资料


查看完整回答
反对 回复 2022-09-14
?
holdtom

TA贡献1805条经验 获得超10个赞

您可以使用阿帕奇共享资源压缩,如下所示(参考):TarArchiveInputStream


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(); 

}


查看完整回答
反对 回复 2022-09-14
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

Try to read directly from inputstream:

        BufferedReader br = null;   
             while(tarEntry != null){
            br = new BufferedReader(new InputStreamReader(tarEntry));


查看完整回答
反对 回复 2022-09-14
  • 3 回答
  • 0 关注
  • 384 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号