【问题标题】:Read and process files in scala在 scala 中读取和处理文件
【发布时间】:2018-04-01 04:17:48
【问题描述】:

如何读取扩展名为 7z 的文件中所有文件的内容。 假设我有带有 part1.csv 和 part2.csv 的 abc.7z 和带有 part3.csv 和 part4.csv 的 xyz.7z。

我想读取 abc.7z 中的 part1.csv 和 part2.csv 以及 xyz.7z 中的 part3.csv 和 part4.csv 的内容。

我已经尝试过,但在 scala 中无法正确完成,感谢任何帮助!

【问题讨论】:

  • 使用 Apache Commons 压缩 7z 文件并稍后使用 scala 读取文件是否可行?

标签: scala apache-commons java-io


【解决方案1】:

这是您可以做到的一种方法。它遗漏了很多错误处理和边缘情况,但展示了如何做到这一点。

基本上你需要在你的 sbt 中添加以下依赖:

  "org.apache.commons" % "commons-compress" % "1.16.1",
  "org.tukaani" % "xz" % "1.8"

我只是使用了非常简单的文件:

part1.cv

name, value
part1, 1

part2.cv

name, value
part2, 2

part3.cv

name, value
part3, 3

part4.cv

name, value
part4, 4

然后按照您的描述将它们分发到abc.7zxyz.7z 文件中

这是一个非常简单的代码:

import org.apache.commons.compress.archivers.sevenz.SevenZFile
import scala.collection.JavaConverters._

object CompressionTest extends App {

  def loadCsvLinesFromZFile(compressedFile: String, fileName: String): Vector[String] = {
    val zFile = new SevenZFile(new File(compressedFile))

    zFile.getEntries.asScala.find { entry ⇒
      // internally zFile keeps last file with call to getNextEntry
      // it's a bit ugly in scala terms
      zFile.getNextEntry
      !entry.isDirectory && entry.getName == fileName
    }.fold(Vector.empty[String]){ csv ⇒
      val content = new Array[Byte](csv.getSize.toInt)
      zFile.read(content, 0, content.length)
      new String(content).split("\n").toVector
    }
  }

  val allOutput = (loadCsvLinesFromZFile("abc.7z", "part1.csv") ++
  loadCsvLinesFromZFile("abc.7z", "part2.csv") ++
  loadCsvLinesFromZFile("xyz.7z", "part3.csv") ++
  loadCsvLinesFromZFile("xyz.7z", "part4.csv")).mkString("\n")

  println(allOutput)
}

这给了我以下输出:

name, value
part1, 1
name, value
part2, 2
name, value
part3, 3
name, value
part4, 4

我希望这会有所帮助,至少可以帮助您入门。

【讨论】:

    猜你喜欢
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    相关资源
    最近更新 更多