我正在尝试将一个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) }
答案 0 :(得分:1)
这是Java(以及Scala)最糟糕的事情之一。我想在这类问题上花了数百万小时。
如果要从相对路径(即从类路径)获取资源,则需要将资源视为资源。所以,如下所示:
getClass.getResource("AAPL_Historical.csv")
同时产生一个URL,然后可以将其转换为Stream,或者其他任何内容。此表单将期望在与该类相同的(相对)文件夹中找到该资源,但是在资源而不是scala目录中。
如果要将资源放入资源文件夹的顶层,请使用:
getClass.getResource("/AAPL_Historical.csv")
可能有一些其他魔法有效,但我还没有找到它。