从文件SCALA中读取第一个元素和下一个元素



我正在读取一个包含 Int 三元组 (s,p,o( 的 277272 行的文件,如下所示:

10,44,22
10,47,12
15,38,3
15,41,30
16,38,5
16,44,15
16,47,18
22,38,21
22,41,42
34,44,40
34,47,36
40,38,39
40,41,42
45,38,27
45,41,30
46,44,45
46,47,48

从这个文件,我创建了一个随机访问文件对象,以便通过这个文件进行导航。但是我想提取第一列中的一些特定值,例如我想提取第一列中包含 16 的行的值,然后我选择一个位于一半的指针,如下所示:

var lengthfile = (file.length().asInstanceOf[Int])
var initpointer = lengthfile/2

然后我分析第一个值是否为 16,如果不是,我执行了一个将指针移动到下一行的过程,或者在本例中在后面的行中。一旦我检测到第一个值是 16,我需要知道它是在第一行、场景还是最后一行。 我在这里介绍的函数是获取我有指针的行的第一个值,并从下一行知道第一个值。

def firstvalue(pf: Int, file:RandomAccessFile): List[Int] ={
//val file = new RandomAccessFile(filename, "r")
var pointer = pf
var flag = true
var fline = Option("a")
if (pointer <= file.length()-1){
file.seek(pointer)
fline = Option(file.readLine)
}
else {
pointer = file.length().toInt-12
file.seek(pointer)
fline = Option(file.readLine)
}
while (flag)
{
if (fline.get != "")
{
if (pointer == 0)
{
file.seek(pointer)
fline = Option(file.readLine)
pointer -= 1
flag = false
}
else{
pointer -= 1
file.seek(pointer)
fline = Option(file.readLine)
}
}
else if (fline.get == ""){
flag = false
}
}
pointer += 1
file.seek(pointer)
val line = Option(file.readLine)
val spl = line.get.split(',')
val p = spl.apply(0).toInt
//file.close()
val l = pointer :: p :: Nil
l
}
//def nextvalue(pf: Int, filename:String): List[Int] = {
//val file = new RandomAccessFile(filename, "r")
def nextvalue(pf: Int, file:RandomAccessFile): List[Int] = {
//val file = new RandomAccessFile(filename, "r")
var pointer = pf
var p = 0
var flag = true
var lastline = false
var fline = Option ("a")
if (pointer <= file.length()-1){
file.seek(pointer)
fline = Option(file.readLine)
}
//fline = Option(file.readLine)
while (flag){
if (fline.get != "")
{
if (fline == None)
{
flag = false
lastline = true
}
else{
pointer = file.getFilePointer.toInt
fline = Option(file.readLine)
flag = false
}
}
else if (fline.get == ""){
fline = Option(file.readLine)
flag = false
}
}
if (lastline == false)
{
//file.close()
if (fline != None){
val spl = fline.get.split(',')
p = spl.apply(0).toInt
}

}
val l = pointer :: p :: Nil
l
} 

但是我有一个性能问题,因为我正在逐个字符地阅读,我试图在很多日子里解决这个问题,但我没有解决方案。我不知道文件对象是否有回读行的功能,或者允许我改进此代码的功能?如何改进此代码?

Source
.fromFile(file)
.getLines
.zipWithIndex
.filter(_._1.startsWith("16,"))

将为您提供以"16"开头的所有行,以及它们在文件中的索引。那应该比来回寻找更快...

相关内容

最新更新