1

実際には多くの CSV ファイルを 1 つにまとめた CSV ファイルがあります。このようなもの:

"First Part"
"Some", "data", "in", "here"
"More", "stuff", "over", "here"

"Another Part"
"This", "section", "is", "not", "the", "same", "as", "the", "first"
"blah", "blah", "blah", "blah", "blah", "blah", "blah", "blah", "blah"

"Yet another section"
"And", "this", "is", "yet", "another"
"blah", "blah", "blah", "blah", "blah"

個別のコンポーネントに分割したいと思います。groupBy各セクションのヘッダーがわかっている場合、一連の正規表現を表すヘッダー パターンを渡して aSeq[Seq[String]]または類似の何かを返すような何らかの処理を行うことができれば、それは素晴らしいことです。

4

2 に答える 2

1

次のことができます。

val groups = List("\"First Part\"", "\"Another Part\"", "\"Yet another section\"")
val accumulator = List[List[String]]()
val result = input.split("\n").foldLeft(accumulator)((acc,e) => {
  if (groups.contains(e)) {
    // Make new group when we encounter a string matching one of the groups
    Nil :: acc
  } else {
    // Grab current group and modify it
    val newHead = e :: acc.head 
    newHead :: acc.tail 
  }
})

の各リストはresultグループを表します。groups.contains(e)正規表現を使用して一致を検索する場合は、を一致テストに置き換えてください。ここで言及に値するかもしれないいくつかの微妙な点があります:

  • 入力が見出しで始まらない場合、アルゴリズムは失敗します
  • 見出しが存在するたびに数回存在する場合、新しいグループが生成されます
  • グループには、入力の行が逆に含まれます。
  • 空の行も結果に含まれます。
于 2013-03-09T06:29:02.780 に答える
0

編集これは、同時に投稿された他のソリューションと似ています。size==1 の簡単なハックの代わりに、セクションの見出しに対して同様のことを行うことができます。このソリューションには、セクション名を含めるという追加の利点があるため、順序は関係ありません。

val file: List[String] = """

heading
1,2,3
4,5

heading2
5,6
""".split("\n").toList
val splitFile = file
  .map(_.split(",").toList)
  .filterNot(_ == List(""))
  .foldLeft(List[(String, List[List[String]])]()){
    case (h::t,l) => {if(l.size==1) (l(0),List()):: h :: t else (h._1, l :: h._2) :: t}; 
    case (Nil, l)=> if(l.size==1) List((l(0),List())) else List() }
  .reverse

生産する

 splitFile: List[(String, List[List[String]])] = List((heading,List(List(4, 5), List(1, 2, 3))), (heading2,List(List(5, 6))))
于 2013-03-09T06:32:49.753 に答える