当前位置: 首页 > 知识库问答 >
问题:

读取tar中CSV文件的内容。广州档案馆

吴高远
2023-03-14

我想在数据库表中保存table档案的内容。

该存档包含CSV格式的txt文件。

想法是在数据库中为txt文件中的每一行插入一行。

问题是我无法单独读取文件的内容,然后转到下一个文件。

EntryTable和EntryTableLine下面是Hibernate实体。

EntryTable与EntryTableLine处于OneTo很多关系(一个文件-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()为null。

假设我在存档中有4个文件。每个文件内部有 3 行。但是,在数据库中,某些条目有 5 行,而其他条目没有。

谢谢!

共有3个答案

韩楷
2023-03-14

做类似的事情解决了这个问题:

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

评论中提到的参考资料

楚博雅
2023-03-14

尝试直接从inputstream读取:

        BufferedReader br = null;
        while(tarEntry != null){
            br = new BufferedReader(new InputStreamReader(tarEntry));
元景天
2023-03-14

您可以使用Apache Commons CompressTarArchiveInputStream,如下所示(参考):

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(); 
}
 类似资料:
  • 问题内容: 我想读取CSV文件并使用AngularJS和HTML5获取其内容。我想将csv文件的内容放在$ scope中。 我的HTML中有此代码 问题答案: 使用自定义指令: http://plnkr.co/edit/eeQbR65oE8iljm7ueGhX?p=preview

  • 看起来有点讽刺,但当我读2GB的时候。csv文件逐行使用BufferedReader,耗时约4.5秒。我用大约230MB的gzip压缩了文件。我使用了用BufferedReader包装的GZIPInputStream来读取。gz文件。大约用了8.5秒。 我知道InputStream接口读取的是字节数据,而不是读卡器,但我认为如果一个200MB的文件加载到内存会更快。是否可以使用实现更好的性能。gz

  • 问题内容: 我试图从战争档案中读取文本文件,并在运行时将其内容显示在facelets页面中。我的文件夹结构如下 +战争档案> +资源> +电子邮件> + file.txt 我尝试使用以下代码读取resources / email / file.txt文件夹中的文件 但是问题是当我运行上面代码的方法时,会抛出A。我也尝试使用以下代码行获取文件,但未成功 我仍然得到。这是怎么引起的,我该如何解决? 问

  • 我有一个.tar文件,其中包含文件夹中的许多.gz文件。这些 gz 文件中的每一个都包含一个.txt文件。与此问题相关的其他堆栈溢出问题旨在提取文件。 我试图反复阅读每一个的内容。txt文件,因为。焦油很大。 首先我阅读了. tar文件的内容: 或在Unix中: 然后我尝试使用tarfile提取文件方法,但我得到一个错误:“模块'tarfile'没有属性'提取文件'”。此外,我甚至不确定这是正确的

  • 逐行读取文本文件的内容,每次一行(比 FileReadLine 执行的更好)。 Loop, Read, InputFile [, OutputFile] 参数 Read 此参数必须为单词 READ. InputFile 需要在循环中读取内容的文本文件的名称, 如果未指定绝对路径则假定在 %A_WorkingDir% 中. 支持 Windows 和 Unix 格式; 即文件的行结束符可以是回车和换行

  • 我试图创建一个简单的java程序,从zip文件中读取并提取文件内容。Zip文件包含3个文件(txt、pdf、docx)。我需要阅读所有这些文件的内容,为此我正在使用ApacheTika。 有人能帮我实现这个功能吗。到目前为止,我已经试过了,但没有成功 代码片段