亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

讀取 tar.gz存檔中的 CSV 文件的內容

讀取 tar.gz存檔中的 CSV 文件的內容

撒科打諢 2022-09-14 15:25:31
我想將 tar.gz 存檔的內容保存在數據庫表中。存檔包含 CSV 格式的 txt 文件。我們的想法是在數據庫中為txt文件中的每一行插入一個新行。問題是我無法單獨讀取文件的內容,然后轉到下一個文件?!叭肟诒怼焙汀叭肟诒砀瘛毕路绞切菝邔嶓w。入口表與入口表格線處于一到很多關系(一個文件 -條目表- 可以有許多行 -入口表格-)。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 關注
  • 238 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號