处理回车的问题在写入CSV文件时返回

时间:2012-11-23 15:47:40

标签: iphone objective-c ios

我需要将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:@","];

3 个答案:

答案 0 :(得分: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:@","];
    }
}

根据您需要写入多少数据,直接写入文件而不是可变字符串会更好。这将导致没有额外的数据副本,并且比首先写入可变字符串更快。

答案 1 :(得分:0)

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

但那将是非常肮脏的解决方案。

答案 2 :(得分:0)

我不会使用自动包含“,”。

这样的事情会起作用:

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

替代方法: 如果你需要使用当前的命令/程序结构(它将在每个字段后面放一个逗号,包括最后一个字段),只需要很少的修改,解决方法是保存一个中间CSV,重新打开它并删除每个最后一个字符(在运输之前)返回每行的\ r \ n)然后将其保存到最终的CSV。 UGLY !!!