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 个额外的副本。这是很多浪费的内存。这是一种更简单的方法,只需要一个额外的副本,不需要额外的数组:

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

你可以使用 [NSString *ArrayConvertedIntoStringFINAL = [[FinalStringsArrayWithCarriageReturns componentsJoinedByString:@","] stringByReplacingOccurrencesOfString:CarriageReturn+@"," withString:CarriageReturn];

但这将是一个非常肮脏的解决方案。

于 2012-11-23T16:01:47.620 回答
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 回答