日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
學(xué)習(xí)Scala腳本:從文件里讀取行記錄

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

創(chuàng)新互聯(lián)主營(yíng)臨西網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶APP開(kāi)發(fā)公司,臨西h5小程序開(kāi)發(fā)搭建,臨西網(wǎng)站營(yíng)銷(xiāo)推廣歡迎臨西等地區(qū)企業(yè)咨詢(xún)

編輯推薦:Scala編程語(yǔ)言專(zhuān)題

 
 
 
  1. import scala.io.Source  
  2.  
  3. if (args.length > 0) {  
  4.  
  5.  for (line <- Source.fromFile(args(0)).getLines)  
  6.   print(line.length + " " + line)  
  7. }  
  8. else  
  9.  Console.err.println("Please enter filename")  

代碼 3.10 從文件中讀入行

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

 
 
 
  1. $ scala countchars1.scala countchars1.scala 

你會(huì)看到:

 
 
 
  1. 23 import scala.io.Source  
  2. 1  
  3. 23 if (args.length > 0) {  
  4. 1  
  5. 50   for (line <- Source.fromFile(args(0)).getLines)  
  6. 36     print(line.length + " " + line)  
  7. 2 }  
  8. 5 else  
  9. 47 Console.err.println("Please enter filename")  

盡管當(dāng)前形式的腳本打印出了所需的信息,你或許希望能讓數(shù)字右序排列,并加上管道符號(hào),這樣輸出看上去就替換成:

 
 
 
  1. 23 | import scala.io.Source  
  2.  1 |  
  3. 23 | if (args.length > 0) {  
  4.  1 |  
  5. 50 |   for (line <- Source.fromFile(args(0)).getLines)  
  6. 36 |     print(line.length + " " + line)  
  7.  2 | }  
  8.  5 | else  
  9. 47 |   Console.err.println("Please enter filename")  

想要達(dá)到這一點(diǎn),你可以對(duì)所有行枚舉兩次。***次決定每行字符計(jì)數(shù)的***寬度。第二次打印輸出之前計(jì)算的***寬度。因?yàn)橐杜e兩次,你***把它們賦給變量:

 
 
 
  1. val lines = Source.fromFile(args(0)).getLines.toList 

***的toList是必須加的,因?yàn)間etLines方法返回的是枚舉器。一旦你使用它完成遍歷,枚舉器就失效了。而通過(guò)調(diào)用toList把它轉(zhuǎn)換為L(zhǎng)ist,你就可以枚舉任意次數(shù),代價(jià)就是把文件中的所有行一次性貯存在內(nèi)存里。lines變量因此就指向著包含了命令行指定的文件文本字串的數(shù)組。

下一步,因?yàn)橐獙?duì)每行字符數(shù)計(jì)算兩次,每個(gè)枚舉計(jì)算一次,你或許會(huì)考慮把表達(dá)式拉出來(lái)變成一個(gè)小函數(shù),專(zhuān)門(mén)用來(lái)計(jì)算傳入字串的字符長(zhǎng)度:

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

有了這個(gè)函數(shù),你就可以計(jì)算***長(zhǎng)度了:

 
 
 
  1. var maxWidth = 0 
  2. for (line <- lines)  
  3.  maxWidthmaxWidth = maxWidth.max(widthOfLength(line)) 

這里你用一個(gè)for表達(dá)式枚舉了每一行,計(jì)算這些行的寬度,并且,如果比當(dāng)前***寬度還大,就把它賦值給maxWidth,一個(gè)初始化為0的var。(max方法是你可以在任何Int上調(diào)用的,可以返回被調(diào)用者和被傳入者中的較大的值。)如果你希望不用var發(fā)現(xiàn)***值,替代的方法是可以首先找到最長(zhǎng)的一行,如:

 
 
 
  1. val longestLine = lines.reduceLeft(  
  2.  (a, b) => if (a.length > b.length) a else b  
  3. )  
  4.  
  5. val widths = lines.map(widthOfLength)  

reduceLeft方法把傳入的方法應(yīng)用于lines的前兩個(gè)元素,然后再應(yīng)用于***次應(yīng)用的結(jié)果和lines接下去的一個(gè)元素,等等,直至整個(gè)列表。每次這樣的應(yīng)用,結(jié)果將是碰到的最長(zhǎng)一行,因?yàn)閭魅氲暮瘮?shù),(a, b) => if (a.length > b.length) a else b,返回兩個(gè)傳入字串的最長(zhǎng)那個(gè)。reduceLeft將傳回***一次應(yīng)用的結(jié)果,也就是本例lines中包含的最長(zhǎng)字串。

得到這個(gè)結(jié)果之后,你可以通過(guò)把最長(zhǎng)一行傳給widthOfLength計(jì)算***的寬度:

 
 
 
  1. val maxWidth = widthOfLength(longestLine) 

***剩下的就是用一個(gè)合適的格式把這些行打印出來(lái)。你可以這么做:

 
 
 
  1. for (line <- lines) {  
  2.  val numSpaces = maxWidth - widthOfLength(line)  
  3.  val padding = " " * numSpaces  
  4.  print(padding + line.length + " | " + line)  

在這個(gè)for表達(dá)式里,你再一次枚舉了全部行記錄。對(duì)于每一行,首先計(jì)算行長(zhǎng)度前所需的空格并把它賦給numSpaces。然后用表達(dá)式:" " * numSpaces創(chuàng)建包含numSpaces個(gè)空格的字串。最終,你打印出你想要格式的信息。全部的腳本展示在代碼3.11中:

 
 
 
  1. import scala.io.Source  
  2. def widthOfLength(s: String) = s.length.toString.length  
  3. if (args.length > 0) {  
  4.  val lines = Source.fromFile(args(0)).getLines.toList  
  5.  val longestLine = lines.reduceLeft(  
  6.   (a, b) => if (a.length > b.length) a else b  
  7.  )  
  8.  val maxWidth = widthOfLength(longestLine)  
  9.  for (line <- lines) {  
  10.   val numSpaces = maxWidth widthOfLength(line)  
  11.   val padding = " " * numSpaces  
  12.   print(padding + line.length +" | "+ line)  
  13.  }  
  14. }  
  15. else  
  16.  Console.err.println("Please enter filename")  

代碼 3.11 對(duì)文件的每行記錄打印格式化的字符數(shù)量。

本文節(jié)選自《Programming in Scala》

【相關(guān)閱讀】

  1. 學(xué)習(xí)識(shí)別Scala的函數(shù)式風(fēng)格
  2. Scala編程實(shí)例:使用Set和Map
  3. Scala編程實(shí)例:使用List和Tuple
  4. Scala編程實(shí)例:帶類(lèi)型的參數(shù)化數(shù)組
  5. 初探Scala編程:編寫(xiě)腳本,循環(huán)與枚舉

本文標(biāo)題:學(xué)習(xí)Scala腳本:從文件里讀取行記錄
文章出自:http://www.5511xx.com/article/cdojpho.html