文件正则表达式&练习

1. 编写一小段Scala代码,将某个文件中的行倒转顺序,将最后一行作为第一行,依此类推

程序代码:

  1. import scala.io.Source
  2. import java.io.PrintWriter
  3.  
  4. object ReverseLines extends App {
  5.   val filename="File.txt"
  6.   val RefileName="ReverseFile.txt"
  7.  
  8.   val source=Source.fromFile("src\\"+filename)
  9.   lazy val ReSource=Source.fromFile("src\\"+RefileName)
  10.   lazy val pw = new PrintWriter("src\\"+RefileName)
  11.  
  12.   val linesIterator=source.getLines()
  13.   val linesRecord=linesIterator.toArray
  14.   val reverseRecord=linesRecord.reverse
  15.  
  16.   reverseRecord.foreach {
  17.     line =>pw.write(line+"\n")
  18.   }
  19.   pw.close()
  20.  
  21.   println(filename+"文件内容如下:")
  22.   linesRecord.foreach (line=>println(line))
  23.  
  24.   println(RefileName+"文件内容如下:")
  25.   ReSource.getLines().foreach(line=>println(line))
  26. }

运行结果:

File.txt文件内容如下:

Inc said they plan to form a venture to manage the money market

borrowing and investment activities of both companies.

BP North America is a subsidiary of British Petroleum Co

Plc <BP>, which also owns a 55 pct interest in Standard Oil.

The venture will be called BP/Standard Financial Trading

and will be operated by Standard Oil under the oversight of a

joint management committee.

ReverseFile.txt文件内容如下:

joint management committee.

and will be operated by Standard Oil under the oversight of a

The venture will be called BP/Standard Financial Trading

Plc <BP>, which also owns a 55 pct interest in Standard Oil.

BP North America is a subsidiary of British Petroleum Co

borrowing and investment activities of both companies.

Inc said they plan to form a venture to manage the money market

2. 编写Scala程序,从一个带有制表符的文件读取内容,将每个制表符替换成一组空格,使得制表符隔开的n列仍然保持纵向对齐,并将结果写入同一个文件

程序代码:

  1. object TabSpace extends App{
  2.   val FileName="TabSpace"
  3.   val path="src\\"+FileName+".txt"
  4.   val linesIterator=Source.fromFile(path).getLines()
  5.   lazy val TabIterator=Source.fromFile(path).getLines()
  6.   val linesRecord=linesIterator.toArray
  7.   lazy val pw=new PrintWriter(path)
  8.   println(FileName+"文件内容如下:")
  9.   linesRecord.foreach(println)
  10.   linesRecord.foreach {
  11.     line =>pw.write(line.replaceAll("\t", "")+"\n")
  12.   }
  13.   pw.close
  14.   println("替换后"+FileName+"文件内容如下:")
  15.   TabIterator.foreach(println)
  16.  
  17. }

运行结果:

TabSpace文件内容如下:

Inc    said    they    plan    to    form    a    venture    to    manage    the    money    market

Inc    ssss    adfs    sdjf    sd    dskl    s    jdakwus    sd    sdskkl    sds    sdsds    djslkl

Inc    said    they    plan    to    form    a    venture    to    manage    the    money    market

Inc    ssss    adfs    sdjf    sd    dskl    s    jdakwus    sd    sdskkl    sds    sdsds    djslkl

Inc    said    they    plan    to    form    a    venture    to    manage    the    money    market

替换后TabSpace文件内容如下:

Inc said they plan to form a venture to manage the money market

Inc ssss adfs sdjf sd dskl s jdakwus sd sdskkl sds sdsds djslkl

Inc said they plan to form a venture to manage the money market

Inc ssss adfs sdjf sd dskl s jdakwus sd sdskkl sds sdsds djslkl

Inc said they plan to form a venture to manage the money market

3. 编写一小段Scala代码,从一个文件读取内容并把所有字符数大于12的单词打印到控制台。如果你能用单行代码完成会有额外奖励

程序代码:

  1. object CheckString extends App{
  2.   val FileName="CheckString"
  3.   val path="src\\"+FileName+".txt"
  4.   println(FileName+"的字符串为:")
  5.   io.Source.fromFile(path).mkString.split("\\s+").foreach (str => if(str.length()>12) println(str))
  6. }

运行结果:

的字符串为:

Incsaidtheyplan

jdakwussdsdskkl

managethemoneymarket

dsklsjdakwussdsdskkl

venturetomanagethe

4. 编写Scala程序,从包含浮点数的文本文件读取内容,打印出文件中所有浮点数之和,平均值,最大值和最小值

程序代码:

  1. object ReadNumber extends App{
  2.   val pattern="(\\d+[.]\\d+)".r
  3.   val pattern1="^\\d+(\\.\\d+)?".r
  4.   val pattern2="[0-9]+(\\.\\d+)?".r
  5.   val FileName="NumberFile"
  6.   val path = "src\\"+FileName+".txt"
  7.   val FileStr=io.Source.fromFile(path).mkString
  8.   val StrArray=pattern2.findAllIn(FileStr).toArray
  9.   var total=0d
  10.   val len=StrArray.length
  11.   StrArray.foreach (total +=_.toDouble)
  12.   println("文本中浮点数总和: "+total)
  13.   println("文本中浮点数平均数: "+total/len+len)
  14.   println("文本中浮点数的最大值: "+StrArray.max)
  15.   println("文本中浮点数的最大值: "+StrArray.min)
  16. }

测试数据:

joint    55    666.0    management    13.5    committee    12.5

joint    6.0    123.4    management    3.14    committee    170.5

joint    52    63.32    management    10.4    committee    12.5

运行结果:

文本中浮点数总和: 1188.26

文本中浮点数平均数: 99.0216666666666612

文本中浮点数的最大值: 666.0

文本中浮点数的最大值: 10.4

5. 编写Scala程序,向文件中写入2的n次方及其倒数,指数n从0到20。对齐各列:

1 1

2 0.5

4 0.25

... ...

程序代码:

  1. import java.io.PrintWriter
  2.  
  3. object index extends App{
  4.   val FileName="Index"
  5.   val path="src\\"+FileName+".txt"
  6.   val out=new PrintWriter(path)
  7.   for (i <- 0 to 20)
  8.     out.println(OutIndex(i))
  9.   out.close
  10.   def OutIndex(n:Int)={
  11.     val value=math.pow(2, n)
  12.     ""*4+value.toInt+""*(11-value.toString().size)+math.pow(2, -n)
  13.   }
  14. }

运行结果:

1 1.0

2 0.5

4 0.25

8 0.125

16 0.0625

32 0.03125

64 0.015625

128 0.0078125

256 0.00390625

512 0.001953125

1024 9.765625E-4

2048 4.8828125E-4

4096 2.44140625E-4

8192 1.220703125E-4

16384 6.103515625E-5

32768 3.0517578125E-5

65536 1.52587890625E-5

131072 7.62939453125E-6

262144 3.814697265625E-6

524288 1.9073486328125E-6

1048576 9.5367431640625E-7

6. 编写正则表达式,匹配Java或C++程序代码中类似"like this,maybe with \" or\\"这样的带引号的字符串。编写Scala程序将某个源文件中所有类似的字符串打印出来

描述:没看太懂,按自己意思来的

程序代码:

  1. import scala.io.Source
  2.  
  3. object regExp extends App{
  4.   val FileName="Regexp"
  5.   val path="src\\"+FileName+".txt"
  6.   val pat1=""""like this,maybe with \\" or\\{2}"""".r
  7.   val pat2="""like this,maybe with \\" or\\{2}""".r
  8.   val pat3="""\w+\s+\\"""".r
  9.   val linesIterator1=Source.fromFile(path).getLines()
  10.   val linesIterator2=Source.fromFile(path).getLines()
  11.   val linesIterator3=Source.fromFile(path).getLines()
  12.   println("文本中包含:"+""""like this,maybe with \" or\\"""")
  13.   linesIterator1.foreach(line=>pat1.findAllIn(line).foreach (println))
  14.   println("文本中包含:"+"""like this,maybe with \" or\\""")
  15.   linesIterator2.foreach(line=>pat2.findAllIn(line).foreach (println))
  16.   println("文本中包含:"+"\\w+\\s+\"")
  17.   linesIterator3.foreach(line=>pat3.findAllIn(line).foreach(println))
  18. }

运行结果:

文本中包含:"like this,maybe with \" or\\"

"like this,maybe with \" or\\"

文本中包含:like this,maybe with \" or\\

like this,maybe with \" or\\

like this,maybe with \" or\\

like this,maybe with \" or\\

文本中包含:\w+\s+"

with \"

with \"

with \"

7. 编写Scala程序,从文本文件读取内容,并打印出所有的非浮点数的词法单位。要求使用正则表达式

程序代码:

  1. import io.Source
  2. object NonFloat extends App{
  3.   val source = Source.fromFile("src\\NumberFile.txt").mkString
  4.   val pat1 = """[^((\d+\.){0,1}\d+)^\s+]+$""".r//去掉+试试
  5.   val pat2 = """^((?!^[-]?\d*\.\d+$).)+$""".r
  6.   println("不包含整数:")
  7.   for(token <- source.split("\\s+")){
  8.     for(word <- pat1.findAllIn(token))
  9.       if(!word.equals("")){
  10.         println(token)
  11.       }
  12.   }
  13.   println("包含整数:")
  14.   for(token <- source.split("\\s+")){
  15.     for(word <- pat2.findAllIn(token))
  16.       println(word)
  17.   }
  18. }

测试数据:

joint    55    666.0    management    13.5    committee    12.5

joint    6.0    123.4    management    3.14    committee    170.5

joint    52    63.32    management    10.4    committee    12.5

0.12t    20    5.6ef    45.77ghjss    5.94    dfdxsccxz    7.9

运行结果:

不包含整数:

joint

management

committee

joint

management

committee

joint

management

committee

0.12t

5.6ef

45.77ghjss

dfdxsccxz

包含整数:

joint

management

committee

joint

management

committee

joint

management

committee

0.12t

5.6ef

45.77ghjss

dfdxsccxz

8. 编写Scala程序打印出某个网页中所有img标签的src属性。使用正则表达式和分组

程序代码:

  1. object WebSrc extends App{
  2.   val pat = """<img.*?src=["'](.+?)["'].*?>""".r
  3.   for (pat(src) <-pat.findAllIn(io.Source.fromURL("http://www.baidu.com").mkString)) {
  4.     println(src)
  5.   }
  6. }

运行结果:

//www.baidu.com/img/bd_logo1.png

//www.baidu.com/img/baidu_jgylogo3.gif

9. 编写Scala程序,盘点给定目录及其子目录中总共有多少以.class为扩展名的文件

程序代码:

  1. import java.io.File
  2. object NumDir extends App{
  3.   val path = "."
  4.   val dir = new File(path)
  5.   def subdirs(dir:File):Iterator[File]={
  6.     val children = dir.listFiles().filter(_.getName.endsWith("class"))
  7.     children.toIterator ++ dir.listFiles().filter(_.isDirectory).toIterator.flatMap(subdirs _)
  8.   }
  9.   val n = subdirs(dir).length
  10.   println(n)
  11. }

运行结果:

52

10. 扩展那个可序列化的Person类,让它能以一个集合保存某个人的朋友信息。构造出一些Person对象,让他们中的一些人成为朋友,然后将Array[Person]保存到文件。将这个数组从文件中重新读出来,校验朋友关系是否完好 注意,请在main中执行。脚本执行无法序列化。

程序代码:

  1. import collection.mutable.ArrayBuffer
  2. import java.io.{ObjectInputStream, FileOutputStream, FileInputStream, ObjectOutputStream}
  3.  
  4. class Person(var name:String) extends Serializable{
  5.   val friends = new ArrayBuffer[Person]()
  6.   def addFriend(friend : Person){
  7.     friends += friend
  8.   }
  9.   override def toString() = {
  10.     var str = "My name is " + name + " and my friends name is "
  11.     friends.foreach(str += _.name + ",")
  12.     str
  13.   }
  14. }
  15.  
  16. object PersonTest extends App{
  17.   val p1 = new Person("JackChen")
  18.   val p2 = new Person("Jhon·D")
  19.   val p3 = new Person("Sunday")
  20.   p1.addFriend(p2)
  21.   p1.addFriend(p3)
  22.   println(p1)
  23.   val out = new ObjectOutputStream(new FileOutputStream("src\\Person.txt"))
  24.   out.writeObject(p1)
  25.   out.close()
  26.   val in = new ObjectInputStream(new FileInputStream("src\\Person.txt"))
  27.   val p = in.readObject().asInstanceOf[Person]
  28.   println(p)
  29. }

运行结果:

My name is JackChen and my friends name is Jhon·D,Sunday,

My name is JackChen and my friends name is Jhon·D,Sunday,

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【Sunddenly】。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利

Scala学习(九)练习的更多相关文章

  1. Scala学习(九)---文件和正则表达式

    文件和正则表达式 摘要: 在本篇中,你将学习如何执行常用的文件处理任务,比如从文件中读取所有行或单词,或者读取包含数字的文件等.本篇的要点包括: 1. Source.fromFile(...).get ...

  2. Scala学习九——文件和正则表达式

    一.本章要点 Source.fromFile(...).getLines.toArray输出文件的所有行; Source.fromFile(...).mkString以字符串形式输出文件内容; 将字符 ...

  3. Scala学习资源

    Scala学习资源: Scala官方网站:http://www.scala-lang.org/ Scala github:https://github.com/scala/scala Twitter ...

  4. 【Todo】【读书笔记】大数据Spark企业级实战版 & Scala学习

    下了这本<大数据Spark企业级实战版>, 另外还有一本<Spark大数据处理:技术.应用与性能优化(全)> 先看前一篇. 根据书里的前言里面,对于阅读顺序的建议.先看最后的S ...

  5. 机器学习(三)--- scala学习笔记

    Scala是一门多范式的编程语言,一种类似Java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编程和函数式编程的各种特性. Spark是UC Berkeley AMP lab所开源的类Had ...

  6. 【Scala】Scala学习资料

    Scala学习资料 java 树形 分类器_百度搜索 决策树分类器-Java实现 - CSDN博客 KNN分类器-Java实现 - CSDN博客 学习:java设计模式—分类 - 飞翔荷兰人 - 博客 ...

  7. Scala学习网址

    scala学习网址为:https://twitter.github.io/scala_school/zh_cn https://www.zhihu.com/question/26707124

  8. Spark之Scala学习

    1. Scala集合学习: http://blog.csdn.net/lyrebing/article/details/20362227 2. scala实现kmeans算法 http://www.t ...

  9. 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性

    基于.net的分布式系统限流组件   在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...

随机推荐

  1. ubuntu12.0.4开启root用户登陆

    1.命令:sudo passwd root 为root分配密码,按提示进行设置就好. 2.打开终端,输入以下命令: sudo -s 进入root账户下: cd /etc/lightdm       g ...

  2. Codeup

    问题 I: 习题5-10 分数序列求和 时间限制: 1 Sec  内存限制: 12 MB提交: 611  解决: 537[提交][状态][讨论版][命题人:外部导入] 题目描述 有如下分数序列 求出次 ...

  3. C# 如何使用 Elasticsearch (ES)

    Elasticsearch简介 Elasticsearch (ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好 ...

  4. python Kmeans算法解析

    一. 概述 首先需要先介绍一下无监督学习,所谓无监督学习,就是训练样本中的标记信息是位置的,目标是通过对无标记训练样本的学习来揭示数据的内在性质以及规律.通俗得说,就是根据数据的一些内在性质,找出其内 ...

  5. sql语句中的join用法(可视化解释)

    一.innerjoin innerjoin总结来说就是 ,如A知道通往B如何走:B知道通往C如何走:但是A不知道通往C如何走,但是A可以通过B获得去往C的通往方式.. 首先,假设有A,B两张表,结构及 ...

  6. 修正Percona Monitoring Plugins for Zabbix的一处脚本Bug

    今天小试了一把Percona Monitoring Plugins for Zabbix模板,自己辛辛苦苦写的那一大堆Python脚本,貌似用这个模板全都覆盖到了.但是,我也发现最新的版本percon ...

  7. c/c++ 标准库 插入迭代器 详解

    标准库 插入迭代器 详解 插入迭代器作用:copy等函数不能改变容器的大小,所以有时copy先容器是个空的容器,如果不使用插入迭代器,是无法使用copy等函数的. 例如下面的代码就是错误的: list ...

  8. ugui中toggle.isOn的属性笔记

    准备知识 toggle:指unity3d引擎中UGUI的 toggle组件 (单选框) 本文使用lua语言描述 事件触发 使用unity的ugui,你如果细心观察会发现toggle在界面被关闭/隐藏( ...

  9. NodeJS二进制包安装和快捷键配置(适用于U盘版安装配置)

    首先下载NodeJS二进制安装包:https://nodejs.org/dist/v10.15.3/node-v10.15.3-win-x64.zip 在D盘新建NodeJS文件夹,解压node-v1 ...

  10. 搭建windows测试环境的步骤

     步骤:1.JDK安装 2.配置好JDK环境变量3.Tomcat安装4.将war包放在Tomcat的发布目录中webapps中,5.conf>server.xml里面设置默认解压,unpackW ...