2012-01-16 15 views
0

:私の具体的な問題は解決されました(下部に説明されています)。将来の訪問者がこの質問に寄稿したいと思っている場合、私は質問を残します。アンドロイドのJSONArrayへのCSVファイル

.csvファイルをJSONArrayベースの文字列に変換する方法(つまり、.csvファイルをJSONArrayの.toString()バージョンに変換する方法)の方が効率的ですか?

これは私の(非常に非効率的でシンプルな)アルゴリズムです:

StringBuilder sb = new StringBuilder(); 
sb.append("["); 
boolean firstJson = true; 
String toSendOut; 

for(int i = 0; i < textToSession.length(); i++){ 
    if(firstJson) { 
      sb.append("[\""); 
      sb.append(textToSession.charAt(i)); 
      firstJson = false; 
    } else if (textToSession.charAt(i) == ' ') { 
      continue; 
    } else if (textToSession.charAt(i) == ',') { 
      sb.append("\",\""); 
    } else if (textToSession.charAt(i) == '\n') { 
      if(i == textToSession.length() - 1) { 
       sb.append("\"]"); 
      } else { 
       sb.append("\"],"); 
      } 
      firstJson = true; 
    } else { 
      sb.append(textToSession.charAt(i)); 
    } 

    partialProg = 100.0 * ((double)(i+1)/(double)(textToSession.length())); 
    dia.setProgress((int) partialProg); 

} 
sb.append("]"); 
toSendOut = sb.toString(); 

それが起こっているかを示すために、高速ProgressDialogとAsyncTaskです。しかし、textToSessionは非常に大きくなります(.csvファイルでは、1行に約3,000行、11行になります)、私のコードは完全に完了します。この変換を行う他の効率的な方法はありますか?

注:
私のコードが混乱している場合、それは基本的にこのような何か(.csvファイル)がかかります。

0.0、5.1、221 \ n125.1、2352.7、591 \ nは

そして、これに変換し(JSONArrayそれは.toString()編された後):

[[ "0.0"、 "5.1"、 "221"]、[ "125.1"、 "2352.7"、 "591"]


解決
.csvファイルをJSONArrayに変換するのではなく、データ(.csvファイルの要素)を記録するたびに、 JSONArray(dataPointsという名前)を編集し、そこに複数の.put()のデータをスローしました。その後、私はdataPointsを入れたグローバルなJSONArray(dataSetという名前)を持っていました。これは、全体の.csvファイルを作成し、それを変換しようとするのではなく、私の問題を解決しました。

+0

BufferedReader(in)のString line = br.readLine()についてこのループ内の行でコンバージョンを行い、オブジェクトを作成してJSONArrayに追加しますか? –

+0

個々の行を読み、コンマで区切って配列要素を反復処理するのはなぜですか?そうすれば、あなたは1文字1文字を自分で処理する必要はありません。進行状況バーの更新なしで実行時間を確認しましたか?テキストが_extemely_ largeの場合は、何らかの変更を気付かないので、X文字/行ごとに変更したいと思うかもしれません。 Btw、何がきわめて大きい? – Thomas

+0

両方:私はどちらかを行う方法がわかりません - 答えのコード例を提供していますか? トーマス:非常に大きく、約3000行で、1行に11要素あります。 – Mxyk

答えて

1

putメソッドを使用してJSONArrayにアイテムを1つずつ直接配置しないのはなぜですか?それは本当に速いtoString()を行うことができます。 さらに、私はあなたのファイルを1文字ではなく1行ずつ読みます。

+0

昔、私はそれを持っていましたが、実際には私が今持っているものより少し遅かったのです。当時、私にはたくさんの配列がありました。私はちょうどJSONArrayに入れたそれらのcsv要素。しかし、今は配列がなく、.csvファイルが1つしかないので、今私はどのようにそれを行うこともできません。 – Mxyk

+0

私は実際にこれを動作させました。どうもありがとうございました! :) – Mxyk

関連する問題