无法在Scala.IO.Source

时间:2016-11-28 17:37:17

标签: scala csv

我正在尝试将一个CSV文件读入Scala。我可以使用绝对路径读取正常,但希望能够使用相对路径。

val filename = "sample_data/yahoo_finance/AAPL/AAPL_Historical.csv"
for (line <- Source.fromFile(filename).getLines()) { println(line) }

抛出错误:

java.io.FileNotFoundException: sample_data\yahoo_finance\AAPL\AAPL_Historical.csv 
(The system cannot find the path specified)

然而:

val filename = "C:/Users/hansb/Desktop/Scala Project/src/main/" +
"resources/sample_data/yahoo_finance/AAPL/AAPL_Historical.csv"
for (line <- Source.fromFile(filename).getLines()) { println(line) }

工作正常。

我的理解是scala.io.Source知道在资源文件夹中查找相对路径。

我错过了什么?

使用Phasmid建议的工作代码:

val relativePath = "/sample_data/yahoo_finance/AAPL/AAPL_Historical.csv"
val csv = getClass.getResource(relativePath)

for (line <- Source.fromURL(csv).getLines()){ println(line) }

1 个答案:

答案 0 :(得分:1)

这是Java(以及Scala)最糟糕的事情之一。我想在这类问题上花了数百万小时。

如果要从相对路径(即从类路径)获取资源,则需要将资源视为资源。所以,如下所示:

getClass.getResource("AAPL_Historical.csv")

同时产生一个URL,然后可以将其转换为Stream,或者其他任何内容。此表单将期望在与该类相同的(相对)文件夹中找到该资源,但是在资源而不是scala目录中。

如果要将资源放入资源文件夹的顶层,请使用:

getClass.getResource("/AAPL_Historical.csv")

可能有一些其他魔法有效,但我还没有找到它。