使用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] 
A
Sink[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)
}