2017-07-05 10 views
0

内のリスト、スプリット、私は次のリストを持っているいくつかのファイルのスカラ

10,44,22 
10,47,12 
15,38,3 
15,41,30 
16,44,15 
16,47,18 
22,38,21 
22,41,42 
34,44,40 
34,47,36 
40,38,39 
40,41,42 
45,38,27 
45,41,30 
46,44,45 
46,47,48 

その後、私はそれで一つのファイルを作成していますが、次のコードでコンテンツです:

val fstream:FileWriter = new FileWriter("patSPO.csv") 
    var out:BufferedWriter = new BufferedWriter(fstream) 

    val sl = listSPO.sortBy(l => (l.sub, l.pre)) 
    for (a <- 0 to listSPO.size-1){ 
    out.write(sl(a).sub.toString+","+sl(a).pre.toString+","+sl(a).obj.toString+"\n") 
    } 
    out.close() 

私は分割したいがファイル内のコンテンツは、次に私は4つのファイルのために次を試してください:

val fstream:FileWriter = new FileWriter("patSPO.csv") 
    val fstream1:FileWriter = new FileWriter("patSPO1.csv") 
    val fstream2:FileWriter = new FileWriter("patSPO2.csv") 
    val fstream3:FileWriter = new FileWriter("patSPO3.csv") 
    val fstream4:FileWriter = new FileWriter("patSPO4.csv") 
    var out:BufferedWriter = new BufferedWriter(fstream) 
    var out1:BufferedWriter = new BufferedWriter(fstream1) 
    var out2:BufferedWriter = new BufferedWriter(fstream2) 
    var out3:BufferedWriter = new BufferedWriter(fstream3) 
    var out4:BufferedWriter = new BufferedWriter(fstream4) 
    val b :Int = listSPO.size/4 
    val sl = listSPO.sortBy(l => (l.sub, l.pre)) 
    for (a <- 0 to listSPO.size-1){ 
    out.write(sl(a).sub.toString+","+sl(a).pre.toString+","+sl(a).obj.toString+"\n") 
    } 
    for (a <- 0 to b-1){ 
    out1.write(sl(a).sub.toString+","+sl(a).pre.toString+","+sl(a).obj.toString+"\n") 
    } 
    for (a <- b to (b*2)-1){ 
    out2.write(sl(a).sub.toString+","+sl(a).pre.toString+","+sl(a).obj.toString+"\n") 
    } 
    for (a <- b*2 to (b*3)-1){ 
    out3.write(sl(a).sub.toString+","+sl(a).pre.toString+","+sl(a).obj.toString+"\n") 
    } 
    for (a <- b*3 to (b*4)-1){ 
    out4.write(sl(a).sub.toString+","+sl(a).pre.toString+","+sl(a).obj.toString+"\n") 
    } 

    out.close() 
    out1.close() 
    out2.close() 
    out3.close() 
    out4.close() 

私の質問は、生成するファイルの数(例えば32)、out、for、およびfstreamの32倍を書き込まないようにするには?このタイプを持って、リスト内のオブジェクトを想定し

答えて

0

まずは作ってみよう醜い定型文を削除するためのユーティリティ:

def open(
number: Int = 1, 
prefix: String, 
ext: String 
) = (0 to n-1) 
    .iterator 
    .map { i => 
    "%s%s%s".format(prefix, if(i == 0) "" else i.toString, postfix) 
    }.map(new FileWriter(_)) 
    .map(new BufferedWriter(_)) 


def toString(l: WhateverTheType) = Seq(
    l.sub, 
    l.pre, 
    l.obj 
).mkString(",") + "\n" 

そして今、imp lementation:

writeToFiles(
    listSPO: List[WhateverTheType], 
    numFiles: Int = 1, 
    prefix: String = "pasSPO", 
ext: String = ".csv" 
) = listSPO 
    .grouped((listSPO.size+1)/numFiles) 
    .zip(open(numFiles, prefix, ext)) 
    .foreach { case (input, file) => 
    try { 
    input.foreach(file.write(toString(input))) 
    } finally { 
     file.close 
    } 
    } 
0

(そうでない場合は、あなたのタイプと、以下のコードでrelpace SPOが):

case class SPO(sub: Int, pre: Int, obj: Int) 

これはそれを行う必要があります。

val sl = listSPO.sortBy(l => (l.sub, l.pre)) 

val files = 5 // whatever number you want 

// helper function to write a single list - similar to your implementation but shorter 
def writeListToFile(name: String, list: List[SPO]): Unit = { 
    val writer = new BufferedWriter(new FileWriter(name)) 
    list.foreach(spo => writer.write(s"${spo.sub},${spo.pre},${spo.obj}\n")) 
    writer.close() 
} 

sl.grouped(sl.size/files) // split into sublists 
    .zipWithIndex    // add index of sublists for file name 
    .foreach { 
    case (sublist, 0) => writeListToFile(s"pasSPO.csv", sublist) // if indeed you want the first file name NOT to include the index 
    case (sublist, index) => writeListToFile(s"pasSPO$index.csv", sublist) 
    } 
+0

ああ、申し訳ありませんが、それは私がリスト内のオブジェクトを表すクラスと呼ばれる方法です - あなたのクラス( 'pre'、' sub'と 'obj'メンバーを含むいずれかの名前に置き換えます) –

関連する問題