Как преобразовать данные в формат CSV или HTML на iOS? - PullRequest
1 голос
/ 03 октября 2009

В моем приложении iOS мне нужно экспортировать некоторые данные в формат CSV или HTML. Как я могу это сделать?

Ответы [ 3 ]

4 голосов
/ 03 октября 2009

RegexKitLite поставляется с примером того, как читать CSV-файл в NSArray из NSArrays, и идти в обратном направлении довольно тривиально.

Было бы что-то вроде этого (предупреждение: код набран в браузере):

NSArray * data = ...; //An NSArray of NSArrays of NSStrings
NSMutableString * csv = [NSMutableString string];
for (NSArray * line in data) {
  NSMutableArray * formattedLine = [NSMutableArray array];
  for (NSString * field in line) {
    BOOL shouldQuote = NO;
    NSRange r = [field rangeOfString:@","];
    //fields that contain a , must be quoted
    if (r.location != NSNotFound) {
      shouldQuote = YES;
    }
    r = [field rangeOfString:@"\""];
    //fields that contain a " must have them escaped to "" and be quoted
    if (r.location != NSNotFound) {
      field = [field stringByReplacingOccurrencesOfString:@"\"" withString:@"\"\""];
      shouldQuote = YES;
    }
    if (shouldQuote == YES) {
      [formattedLine addObject:[NSString stringWithFormat:@"\"%@\"", field]];
    } else {
      [formattedLine addObject:field];
    }
  }
  NSString * combinedLine = [formattedLine componentsJoinedByString:@","];
  [csv appendFormat:@"%@\n", combinedLine];
}
[csv writeToFile:@"/path/to/file.csv" atomically:NO];
2 голосов
/ 03 октября 2009

Общее решение - использовать stringWithFormat: для форматирования каждой строки. Предположительно, вы записываете это в файл или сокет, и в этом случае вы записываете представление данных каждой строки (см. dataUsingEncoding:) в дескриптор файла при его создании.

Если вы форматируете много строк, вы можете использовать initWithFormat: и явные release сообщения, чтобы избежать нехватки памяти из-за накопления слишком большого количества строковых объектов в пуле автоматического выпуска.

И всегда, всегда, всегда не забывайте корректно экранировать значения перед передачей их в метод форматирования.

Экранирование (вместе с эскейпингом) - это действительно хорошая вещь для написания юнит-тестов. Напишите функцию для CSV-форматирования одной строки и получите контрольные примеры, которые сравнивают ее результат с правильным выводом. Если у вас под рукой есть синтаксический анализатор CSV, или он вам понадобится, или вы просто хотите быть уверены, что ваше экранирование правильное, напишите модульные тесты для синтаксического анализа и эскапинга, а также экранирования и форматирования.

Если вы можете начать с одной записи, содержащей любую комбинацию CSV-специальных и / или SQL-специальных символов, отформатируйте ее, проанализируйте отформатированную строку и в итоге получите запись, равную той, с которой вы начали, вы знаете, ваш код хороший.

(Все вышеперечисленное в равной степени относится и к CSV, и к HTML. Если возможно, вы можете рассмотреть возможность использования XHTML, чтобы можно было использовать инструменты проверки XML и анализаторы, включая NSXMLParser.)

0 голосов
/ 03 октября 2009

CSV - значения через запятую.

Обычно я просто перебираю структуры данных в моем приложении и выводю один набор значений на строку, значения внутри набора разделяются запятой.

struct person
{
    string first_name;
    string second_name;
};

person tony = {"tony", "momo"};
person john = {"john", "smith"};

будет выглядеть как

tony, momo
john, smith
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...