:私の具体的な問題は解決されました(下部に説明されています)。将来の訪問者がこの質問に寄稿したいと思っている場合、私は質問を残します。アンドロイドの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ファイルを作成し、それを変換しようとするのではなく、私の問題を解決しました。
BufferedReader(in)のString line = br.readLine()についてこのループ内の行でコンバージョンを行い、オブジェクトを作成してJSONArrayに追加しますか? –
個々の行を読み、コンマで区切って配列要素を反復処理するのはなぜですか?そうすれば、あなたは1文字1文字を自分で処理する必要はありません。進行状況バーの更新なしで実行時間を確認しましたか?テキストが_extemely_ largeの場合は、何らかの変更を気付かないので、X文字/行ごとに変更したいと思うかもしれません。 Btw、何がきわめて大きい? – Thomas
両方:私はどちらかを行う方法がわかりません - 答えのコード例を提供していますか? トーマス:非常に大きく、約3000行で、1行に11要素あります。 – Mxyk