0

NSStringsを配列からドキュメントディレクトリの.csvファイルに保存する必要がありますが、これは問題ではありませんが、キャリッジリターンの処理方法がわかりません。8ごとにキャリッジリターンを適用するように指定します。セルとこれは正しく発生します。ただし、実際のCSVファイルを書き込む場合は、キャリッジリターンの後に不要なカンマが追加されます。これは有罪判決を受けた行です:

NSString *ArrayConvertedIntoStringFINAL = [FinalStringsArrayWithCarriageReturns componentsJoinedByString:@","];

キャリッジリターンの後にコンマを適用しないようにコンパイラに指示するにはどうすればよいですか?

これが完全なコードです。みんなありがとう!

//Add a Carriage Return symbol every N objects (every FREQUENCY)
int FREQUENCY = 8;

//Define String WithCarriageReturns
NSMutableArray *FinalStringsArrayWithCarriageReturns = [[NSMutableArray alloc] initWithCapacity:0];

for (int i = 1; i <= [FinalStringsArray count]; i++)
{
    NSString *readValue = [FinalStringsArray objectAtIndex:i-1];
    //Add objects to the final string
    [FinalStringsArrayWithCarriageReturns addObject:readValue];

    if ( (i % FREQUENCY) == 0) //Number is multiple of N
    {
        //Every multiple of N add the Carriage Return symbol
        [FinalStringsArrayWithCarriageReturns addObject:CarriageReturn];
    }
}
NSLog(@"+2+Broken down array strings: %@",FinalStringsArrayWithCarriageReturns);

//PROBLEM! A comma is added after the Carriage Return

//Convert Array into String
NSString *ArrayConvertedIntoStringFINAL = [FinalStringsArrayWithCarriageReturns componentsJoinedByString:@","];
4

3 に答える 3

3

投稿したアプローチにより、すべての文字列の 2 つの追加コピーが作成されます。それは多くの無駄なメモリです。これは、追加のコピーを 1 つだけ必要とし、追加の配列を必要としない、より単純なアプローチです。

int FREQUENCY = 8;

NSMutableString *csv = [NSMutableString string];

NSUInteger count = FinalStringsArray.count;
for (int i = 1; i <= count; i++) {
    NSString *readValue = FinalStringsArray[i - 1];

    // TODO - deal with possibility of 'readValue' containing a comma or carriage return
    [csv appendString:readValue];

    if ((i % FREQUENCY) == 0) { //Number is multiple of N
        [csv appendString:CarriageReturn];
    } else {
        [csv appendString:@","];
    }
}

書き込む必要があるデータの量によっては、変更可能な文字列ではなく、ファイルに直接書き込む方がよいでしょう。これにより、データの余分なコピーが発生せず、最初に変更可能な文字列に書き込むよりも高速になります。

于 2012-11-23T16:53:08.537 に答える
0

「、」の自動インクルードは使用しません。

このようなものが機能します:

if (i % FREQUENCY > 0) {
  //add cell + comma to string end
} else {
  //add cell + carriage return \r\n
}

見苦しい回避策:最小限の変更で現在のコマンド/プログラム構造(最後のフィールドを含むすべてのフィールドの後にコンマを配置する)を使用する必要がある場合、回避策は中間CSVを保存し、再度開いて最後の文字をすべて削除することです。 (キャリッジリターンの前に、すべての行の\ r \ nを返します)そして、それを最終的なCSVに保存します。ぶさいくな!!!

于 2012-11-23T16:09:23.397 に答える
0

[NSString *ArrayConvertedIntoStringFINAL = [[FinalStringsArrayWithCarriageReturns componentsJoinedByString:@","] stringByReplacingOccurrencesOfString:CarriageReturn+@"," withString:CarriageReturn];を使用できます 。

しかし、それは非常に汚い解決策になります。

于 2012-11-23T16:01:47.620 に答える