使用scala fs2文件流从文件中删除筛选的行
如何使用从当前流文件中删除使用scala fs2文件流从文件中删除筛选的行,scala,scala-cats,fs2,scala-streams,Scala,Scala Cats,Fs2,Scala Streams,如何使用从当前流文件中删除过滤的行,并将过滤行的计数作为返回类型 例如:如果old.txt包含由换行符(\n)分隔的字符串: 和val myList=List(“chen”、“yval”) 您可以使用流类的 您正在寻找一个函数def converter[F[\u]:Sync]:F[Int], 它生成一个计算,其结果(类型为Int)是过滤的行数,其作用是将这些行写入输出文件。要进行管道类比,您需要将过滤后的流提供给两个输出,一个用于结果,另一个用于效果。 您可以使用定义为 def observe(
过滤的
行,并将过滤行的计数作为返回类型
例如:如果old.txt
包含由换行符(\n)分隔的字符串:
和val myList=List(“chen”、“yval”)
您可以使用流
类的
您正在寻找一个函数def converter[F[\u]:Sync]:F[Int]
,
它生成一个计算,其结果(类型为Int
)是过滤的行数,其作用是将这些行写入输出文件。要进行管道类比,您需要将过滤后的流提供给两个输出,一个用于结果,另一个用于效果。
您可以使用定义为
def observe(sink: Sink[F, O])(implicit F: Effect[F], ec: ExecutionContext): Stream[F, O]
ASink[F,O]
是函数Stream[F,O]=>Stream[F,Unit]
的别名。在您的情况下,接收器是将过滤流写入输出文件的代码部分:
def writeToFile[F[_]: Sync]: Sink[F, String] =
_.intersperse("\n")
.through(text.utf8Encode)
.through(io.file.writeAll(Paths.get("testdata/new.txt")))
另一个输出是减少,或者说是翻倍
def converter[F[_]](implicit F: Effect[F], ec: ExecutionContext): F[Int] =
io.file.readAll[F](Paths.get("testdata/old.txt"), 4096)
.through(text.utf8Decode)
.through(text.lines)
.filter(s => myList.contains(s))
.observe(writeToFile[F])
.compile
.fold[Int](0)( (c, _) => c+1)
}
注意:对于此解决方案,需要将F
的类型类限制为Effect
,并且需要使用ExecutionContext
。折叠
在类中定义
def writeToFile[F[_]: Sync]: Sink[F, String] =
_.intersperse("\n")
.through(text.utf8Encode)
.through(io.file.writeAll(Paths.get("testdata/new.txt")))
def converter[F[_]](implicit F: Effect[F], ec: ExecutionContext): F[Int] =
io.file.readAll[F](Paths.get("testdata/old.txt"), 4096)
.through(text.utf8Decode)
.through(text.lines)
.filter(s => myList.contains(s))
.observe(writeToFile[F])
.compile
.fold[Int](0)( (c, _) => c+1)
}