如何阅读扩展名为7z的文件中存在的所有文件的内容。 假设我有partc.csv和part2.csv的abc.7z以及part3.csv和part4.csv的xyz.7z。
我想阅读在abc.7z中的part1.csv和part2.csv以及xyz.7z中的part3.csv和part4.csv的内容。
我已经尝试过但无法正确地执行此操作 in scala ,感谢任何帮助!
答案 0 :(得分: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.7z
和xyz.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
我希望这会有所帮助,至少可以让你开始。