日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

scala从服务器读取文件,学习Scala脚本:从文件里读取行记录

發布時間:2024/5/14 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 scala从服务器读取文件,学习Scala脚本:从文件里读取行记录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

處理瑣碎的,每日工作的腳本經常需要處理文件。本節中,你將建立一個從文件中讀入行記錄,并把行中字符個數前置到每一行,打印輸出的腳本。***版展示在代碼3.10中:

import?scala.io.Source

if?(args.length>0)?{

for?(line

print(line.length?+?"?"?+?line)

}

else

Console.err.println("Please?enter?filename")

代碼 3.10?從文件中讀入行

此腳本開始于從包scala.io引用名為Source的類。然后檢查是否命令行里定義了至少一個參數。若是,則***個參數被解釋為要打開和處理的文件名。表達式Source.fromFile(args(0)),嘗試打開指定的文件并返回一個Source對象,你在其上調用getLines。函數返回Iterator[String],在每個枚舉里提供一行包括行結束符的信息。for表達式枚舉這些行并打印每行的長度,空格和這行記錄。如果命令行里沒有提供參數,***的else子句將在標準錯誤流中打印一條信息。如果你把這些代碼放在文件contchars1.scala,并運行它調用自己:$?scala?countchars1.scala?countchars1.scala

你會看到:23?import?scala.io.Source

1

23?if?(args.length>0)?{

1

50???for?(line

36?????print(line.length?+?"?"?+?line)

2?}

5?else

47?Console.err.println("Please?enter?filename")

盡管當前形式的腳本打印出了所需的信息,你或許希望能讓數字右序排列,并加上管道符號,這樣輸出看上去就替換成:23?|?import?scala.io.Source

1?|

23?|?if?(args.length>0)?{

1?|

50?|???for?(line

36?|?????print(line.length?+?"?"?+?line)

2?|?}

5?|?else

47?|???Console.err.println("Please?enter?filename")

想要達到這一點,你可以對所有行枚舉兩次。***次決定每行字符計數的***寬度。第二次打印輸出之前計算的***寬度。因為要枚舉兩次,你***把它們賦給變量:vallines=Source.fromFile(args(0)).getLines.toList

***的toList是必須加的,因為getLines方法返回的是枚舉器。一旦你使用它完成遍歷,枚舉器就失效了。而通過調用toList把它轉換為List,你就可以枚舉任意次數,代價就是把文件中的所有行一次性貯存在內存里。lines變量因此就指向著包含了命令行指定的文件文本字串的數組。

下一步,因為要對每行字符數計算兩次,每個枚舉計算一次,你或許會考慮把表達式拉出來變成一個小函數,專門用來計算傳入字串的字符長度:def?widthOfLength(s:?String)?=?s.length.toString.length

有了這個函數,你就可以計算***長度了:varmaxWidth=0

for?(line

maxWidthmaxWidth=?maxWidth.max(widthOfLength(line))

這里你用一個for表達式枚舉了每一行,計算這些行的寬度,并且,如果比當前***寬度還大,就把它賦值給maxWidth,一個初始化為0的var。(max方法是你可以在任何Int上調用的,可以返回被調用者和被傳入者中的較大的值。)如果你希望不用var發現***值,替代的方法是可以首先找到最長的一行,如:vallongestLine=lines.reduceLeft(

(a,?b)?=>if?(a.length>b.length)?a?else?b

)

valwidths=lines.map(widthOfLength)

reduceLeft方法把傳入的方法應用于lines的前兩個元素,然后再應用于***次應用的結果和lines接下去的一個元素,等等,直至整個列表。每次這樣的應用,結果將是碰到的最長一行,因為傳入的函數,(a, b) => if (a.length > b.length) a else b,返回兩個傳入字串的最長那個。reduceLeft將傳回***一次應用的結果,也就是本例lines中包含的最長字串。

得到這個結果之后,你可以通過把最長一行傳給widthOfLength計算***的寬度:valmaxWidth=widthOfLength(longestLine)

***剩下的就是用一個合適的格式把這些行打印出來。你可以這么做:for?(line

valnumSpaces=maxWidth-?widthOfLength(line)

valpadding="?"*?numSpaces

print(padding?+?line.length?+?"?|?"?+?line)

}

在這個for表達式里,你再一次枚舉了全部行記錄。對于每一行,首先計算行長度前所需的空格并把它賦給numSpaces。然后用表達式:" " * numSpaces創建包含numSpaces個空格的字串。最終,你打印出你想要格式的信息。全部的腳本展示在代碼3.11中:import?scala.io.Source

def?widthOfLength(s:?String)?=?s.length.toString.length

if?(args.length>0)?{

vallines=Source.fromFile(args(0)).getLines.toList

vallongestLine=lines.reduceLeft(

(a,?b)?=>if?(a.length>b.length)?a?else?b

)

valmaxWidth=widthOfLength(longestLine)

for?(line

valnumSpaces=maxWidthwidthOfLength(line)

valpadding="?"*?numSpaces

print(padding?+?line.length?+"?|?"+?line)

}

}

else

Console.err.println("Please?enter?filename")

代碼 3.11?對文件的每行記錄打印格式化的字符數量。

本文節選自《Programming in Scala》

【相關閱讀】

【責任編輯:楊賽 TEL:(010)68476606】

點贊 0

總結

以上是生活随笔為你收集整理的scala从服务器读取文件,学习Scala脚本:从文件里读取行记录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。