2017-08-02 52 views
0

我讀包含277272行與詮釋三倍(S,P,O),如一個文件:從文件中讀取SCALA第一元素和下一個元素

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 

然後我analize如果第一值是16,如果沒有我做了過程的指針nextlines移動,或者如在本情況下,在回線。一旦我發現第一個值是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 
    } 

但是我有一個H∞性能問題,因爲我對角色讀取字符,我試圖修復了很多天的過程中,我沒有一個解決方案。我不知道如果這個文件對象有一個函數可以讀回行,或者我可以改進這些代碼?我怎樣才能改進這個代碼?

+0

一些條件是檢測如果我在文件的第一個林,或者如果我在文件的結尾 – Vlad

回答

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

會給你所有以「16」開頭的行以及它們在文件中的索引。這應該是更快,然後來回尋找......

相關問題