【问题标题】:error: overloaded method value write with alternatives:错误:使用替代方法写入重载方法值:
【发布时间】:2018-12-19 06:03:56
【问题描述】:

我正在尝试读取一个固定宽度的文件并将其写为文本文件,下面是代码。字段的输入文件布局长度(4,10,3,5,3,1,1,5,7)

094482018-07-10 022 14012 000 0 30000A 002290{

059412018-07-10 022 14013 000 0 30000A 002290{

015172018-07-10 046 17502 000 0 30000A 001699I

scala> val inputdata = scala.io.Source.fromFile("/C:/Users/rrrrrr/Desktop/datas
tage/inputdata.txt")
inputdata: scala.io.BufferedSource = non-empty iterator

scala> val lines = inputdata.getLines
lines: Iterator[String] = non-empty iterator

scala> val matched=lines.map(l=>(l.substring(0,5).trim(),l.substring(5,5).trim()
))
matched: Iterator[(String, String)] = non-empty iterator

scala> val outputdata= new File("/C:/Users/rkumar0/Desktop/folder/output_N4.txt"
)
outputdata: java.io.File = C:\Users\rrrrrrr\Desktop\folder\output_N4.txt

scala> val writer= new BufferedWriter(new FileWriter(outputdata))
writer: java.io.BufferedWriter = java.io.BufferedWriter@759c0c14

scala> matched.foreach{line =>
     | writer.write(line)
     | writer.newLine()
     | }
<console>:19: error: overloaded method value write with alternatives:
  (x$1: Int)Unit <and>
  (x$1: String)Unit <and>
  (x$1: Array[Char])Unit
 cannot be applied to ((String, String))
       writer.write(line)
              ^

scala>

我的输出文件创建为空。

【问题讨论】:

  • l.substring(5,5) 保证为空的String。给它添加.trim() 是没有意义的。

标签: scala


【解决方案1】:

错误消息告诉您write 采用IntStringArray[Char],但您传递给它的是(String, String) 的2 元组。您需要将IntStringArray[Char] 传递给它,而不是(String, String) 的二元组。

【讨论】:

  • 错误信息告诉你确切地哪些类型是允许的。我的回答是确切地告诉您哪些类型是允许的。什么,准确地说是您不了解错误消息吗?如果您能解释一下您对错误消息的不理解之处,将会有所帮助,这样可以改进错误消息,并且其他程序员不会遇到您遇到的同样麻烦。
  • 我是 scala 的新手,我试图读取一个固定宽度的文件,然后执行一些操作,然后写入一个新文件,为了做同样的事情,我已经编写了这段代码,但我认为我错过了一些东西。如果您有解决方案,请指导我。
【解决方案2】:

您的行的类型为(String, String),但要编写它们,您应该使用toString() 方法将它们转换为String,并且不要忘记在编写后调用flush()close()

matched.foreach(line => {
  writer.write(line.toString)
  writer.newLine()
})
writer.flush()
writer.close()

更新的解决方案(基于输入数据)

import java.io.{BufferedWriter, File, FileWriter}
import java.time.LocalDate

import scala.util.{Failure, Success, Try}

val inputData = scala.io.Source.fromFile("/C:/Users/rrrrrr/Desktop/datastage/inputdata.txt")
val lines = inputData.getLines

val boundDate = LocalDate.parse("2018-01-01")

val matched = lines.filter(line =>
  Try(LocalDate.parse(line.substring(5, 15))) match {
    case Success(date) => date.isAfter(boundDate)
    case Failure(_) => false
  })

val outputData = new File("/C:/Users/rkumar0/Desktop/folder/output_N4.txt")

val writer= new BufferedWriter(new FileWriter(outputData))

matched.foreach(line => {
  writer.write(line)
  writer.newLine()
})
writer.flush()
writer.close()

对于基于您输入数据的示例输入(有一些错误的数据):

094482017-06- 022 14012 000 0 30000A 002290{

094482017-326asd- 022 14012 000 0 30000A 002290{

094482017-06-10 022 14012 000 0 30000A 002290{

094482017-12-01 022 14012 000 0 30000A 002290{

094482018-07-10 022 14012 000 0 30000A 002290{

059412018-07-10 022 14013 000 0 30000A 002290{

015172018-07-10 046 17502 000 0 30000A 001699I

015172018-10-25 046 17502 000 0 30000A 001699I

输出将是:

094482018-07-10 022 14012 000 0 30000A 002290{

059412018-07-10 022 14013 000 0 30000A 002290{

015172018-07-10 046 17502 000 0 30000A 001699I

015172018-10-25 046 17502 000 0 30000A 001699I

更新解决方案 2(用于比较前 5 个字节):

val matched = lines.filter(line =>
  Try(line.substring(0, 5).toInt) match {
    case Success(n) => n > 90000
    case Failure(_) => false
  }
)

【讨论】:

  • 转换为字符串后,它给了我括号和,而且长度也不正确。
  • 您能分享一下您的预期输入和预期输出吗?
  • 094482018-07-10 022 14012 000 0 30000A 002290 {059412018-07-10 022 14013 000 0 30000A 002290 {015172018-07-10 046 17502 000 0 30000A 001699I以上是输入,第一场是 (4,10,3,5,3,1,1,5,7) 我希望输出也是固定宽度,?我主要关心的是,如果我想在任何领域做任何操作,那我该怎么做?
  • 如果您将输入和输出放在您的问题中会更好(只需单击编辑)。在评论中看起来不太好。
  • 嘿决斗者,我在问题框中添加了输入,在这里你将指导我如何处理这些记录只要考虑我想要所有大于 2018-01-01 的记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 2018-05-17
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 2019-07-10
相关资源
最近更新 更多