Как написать файл .csv из функции? - PullRequest
2 голосов
/ 23 августа 2011

Привет, друзья! Я получил всю информацию о контактах моего iphone с помощью этой функции ..

    -(void)collectContacts
{
    ABAddressBookRef addressBook = ABAddressBookCreate();
    CFArrayRef people  = ABAddressBookCopyArrayOfAllPeople(addressBook);
    //NSLog(@" the Name %@%",people);
    for(int i = 0;i<ABAddressBookGetPersonCount(addressBook);i++)
    {
        ABRecordRef ref = CFArrayGetValueAtIndex(people, i);
        // Get First name, Last name, Prefix, Suffix, Job title 
        NSString *firstName = (NSString *)ABRecordCopyValue(ref,kABPersonFirstNameProperty);
        NSString *lastName = (NSString *)ABRecordCopyValue(ref,kABPersonLastNameProperty);
        NSString *prefix = (NSString *)ABRecordCopyValue(ref,kABPersonPrefixProperty);
        NSString *suffix = (NSString *)ABRecordCopyValue(ref,kABPersonSuffixProperty);
        NSString *jobTitle = (NSString *)ABRecordCopyValue(ref,kABPersonJobTitleProperty);
        NSLog(@" the phoneType %@%",firstName);
        NSLog(@" the phoneType %@%",lastName);

        ABMultiValueRef phones = ABRecordCopyValue(ref, kABPersonPhoneProperty);
        for(CFIndex j = 0; j < ABMultiValueGetCount(phones); j++)
        {       
            CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(phones, j);   
            NSString *phoneLabel =(NSString*) ABAddressBookCopyLocalizedLabel (ABMultiValueCopyLabelAtIndex(phones, j));
            NSString *phoneNumber = (NSString *)phoneNumberRef;
            NSLog(@" the phoneType %@%",phoneLabel);
            NSLog(@" the phoneNumber %@%",phoneNumber);
        }

        CFStringRef address;
        CFStringRef label;
        ABMutableMultiValueRef multi = ABRecordCopyValue(ref, kABPersonAddressProperty);    
        for (CFIndex i = 0; i < ABMultiValueGetCount(multi); i++) 
        {           
            label = ABMultiValueCopyLabelAtIndex(multi, i);
            CFStringRef readableLabel = ABAddressBookCopyLocalizedLabel(label);
            NSLog(@" Lable %@%",readableLabel);
            address = ABMultiValueCopyValueAtIndex(multi, i);
            NSLog(@" Address %@%",address);
            CFRelease(address);
            CFRelease(label);
        } 

        ABMultiValueRef emails = ABRecordCopyValue(ref, kABPersonEmailProperty);
        for(CFIndex idx = 0; idx < ABMultiValueGetCount(emails); idx++)
        {
            CFStringRef emailRef = ABMultiValueCopyValueAtIndex(emails, idx);
            NSString *strLbl = (NSString*) ABAddressBookCopyLocalizedLabel (ABMultiValueCopyLabelAtIndex (emails, idx));
            NSLog(@" Email Lable %@%",strLbl);
            NSString *strEmail_old = (NSString*)emailRef;
            NSLog(@" Email-Id %@%",strEmail_old);
            //[[strEmail_old componentsJoinedByString:@","] writeToFile:@"components.csv" atomically:YES encoding:NSUTF8StringEncoding error:NULL];
        }
    }
    //[[ContactsText componentsJoinedByString:@","] writeToFile:@"components.csv" atomically:YES encoding:NSUTF8StringEncoding error:NULL];
//  NSLog(@" Data in the .CSV file = %@%",ContactsText);
}
'

Теперь я хочу создать файл .csv из выходных данных этой функции ... и получить все данные в NSLog.Я хочу написать файл .csv из этих данных. Кто-нибудь может мне помочь в этом ??Данные поступают правильно, но файл .csv не записывается ... Спасибо

Ответы [ 3 ]

4 голосов
/ 23 августа 2011

Предполагая, что у вас будут все данные в "ContactsText", попробуйте следующий код:

    NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* savePath = [paths objectAtIndex:0];
    savePath = [savePath stringByAppendingPathComponent:@"components.csv"]; 
    [[ContactsText componentsJoinedByString:@","] writeToFile:savePath atomically:YES encoding:NSUTF8StringEncoding error:NULL];

Помните, что вы не можете просто сохранить файл "components.csv".Вы должны сохранить файл только в папке с документами.

1 голос
/ 23 августа 2011

Существует множество расширений с открытым исходным кодом, которые добавляют поддержку csv для массивов.Например, CHCSVParser , который доступен на GitHub.

0 голосов
/ 23 августа 2011

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

Я бы посоветовал вам использовать CHCSVParser от Дейва Делонга, вы можете найти его здесь: http://davedelong.com/portfolio

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

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