2012-11-23 38 views
0

我需要從一個數組保存NSString的到我的文檔目錄,這是沒有問題的.csv文件,但我不知道如何處理回車..我指定我想要每8個單元格應用回車,並且這種情況正確。但是,在編寫實際的CSV文件時,在回車後添加一個額外的不需要的逗號!這是犯罪行:問題處理回車符,而寫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:@","]; 

回答

3

該方法已張貼在每個字符串的附加2份結果。這是很多浪費的內存。這裏有一個簡單的方法,只需要一個額外的副本,並沒有多餘的數組:你需要多少數據寫入,它甚至會更好,直接寫入文件,而不是可變的字符串

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:@","]; 
    } 
} 

根據。這將不會導致額外的數據副本,並且會比首先寫入可變字符串更快。

+0

優秀的解決方案。像我在做的那樣,比通過另一個陣列更簡單,更高效。非常感謝! – jeddi

+0

什麼是馬車回程?它是@「/ r/n」的字符串嗎? – iosMentalist

+0

@Shady看到問題。它是原始代碼中使用的變量。它的值可以是任何你想要的,並且可以取決於CSV文件的目標操作系統。順便說一句 - 使用反斜槓,而不是斜槓。 – rmaddy

0

您可以使用 [NSString *ArrayConvertedIntoStringFINAL = [[FinalStringsArrayWithCarriageReturns componentsJoinedByString:@","] stringByReplacingOccurrencesOfString:Carri[email protected]"," withString:CarriageReturn];

但是,這將是一個非常解決方案。

+0

完全同意:嘗試讓某人稍後維護您的代碼... –

+0

它返回一個錯誤:無效的操作數到二進制表達式('NSString *'和'NSString *') – jeddi

0

我不會使用自動列入「」。

像這樣的工作:

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

替代方法UGLY: 如果你需要使用當前的命令/程序結構(這將各個領域後放置一個逗號,包括最後一個),以最小的改動,解決方法是保存一箇中間CSV,重新打開它並刪除每個最後一個字符(在每一行返回\ r \ n之前),然後將其保存到最終的CSV中。醜陋!!!