2 Stimmen

Wie konvertiert man das CSV-Format in NSData oder NSString im iPhone?

Ich mache eine iPhone-App, die die aktuellen Aktienkurse benötigt.

Ich erhalte die Daten im CSV-Format von einem unten angegebenen Link.

http://finance.yahoo.com/d/quotes.csv?s=RHT+MSFT&f=sb2b3jk

Ist es möglich, das CSV-Format in das NSData- oder NSString-Format zu konvertieren? Wenn ja, wie kann ich das tun?

Welche anderen Alternativen gibt es dafür?

7voto

Dave DeLong Punkte 240835

Erfinden Sie das Rad nicht neu: CHCSVParser ist ein nativer CSV-Parser, der in Objective-C geschrieben wurde. Er kann Felder in Anführungszeichen, escapete Zeichen usw. korrekt verarbeiten. Er verfügt über Komfortmethoden ( +[NSArray arrayWithContentsOfCSVFile:...] ) und unterteilt das Lesen der Datei, so dass keine Warnungen über zu wenig Speicherplatz ausgegeben werden.

Hier ist (mehr oder weniger), wie Sie es verwenden würden. Die Tatsache, dass die CSV-Datei remote ist, erschwert die Dinge ein wenig, aber nicht viel (Sie müssen den Inhalt der URL in eine Zeichenfolge herunterladen und diese Zeichenfolge dann an den Parser übergeben).

#import "CHCSV.h"

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSString * csv = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://download.finance.yahoo.com/d/quotes.csv?s=RHT+MSFT&f=sb2b3jk"]];
    NSArray * rows = [NSArray arrayWithContentsOfCSVString:csv encoding:NSUTF8StringEncoding error:nil];
    //You can also do:  rows = [csv CSVComponents];
    NSLog(@"rows: %@", rows);
    [pool drain];
    return 0;
}

Diese Protokolle:

2010-12-23 09:05:44.431 CHCSVParser[99377:a0f] (
        (
        RHT,
        "46.48",
        "46.46",
        "26.51",
        "49.00"
    ),
        (
        MSFT,
        "28.23",
        "28.22",
        "22.73",
        "31.58"
    ),
        (
        ""
    )
)

Sie gibt eine NSArray von NSArrays von NSStrings .

3voto

Andy J Buchanan Punkte 1882

In der Annahme, dass Sie fragen, wie man die CSV-Daten analysiert, finden Sie hier einen sehr einfachen Code, der dies ermöglicht. Verwenden Sie Google, wenn Sie fortgeschrittene Parser finden wollen - sie sind da draußen

// CsvParser2.h
#import <Foundation/Foundation.h>

@interface NSString (CsvParser2)
// Returns an array of arrays for rows & columns
-(NSArray *)csvRows;
@end

// CsvParser2.m
#import "CsvParser2.h"

@implementation NSString (CsvParser2)

// Simplest possible implementation... NOT memory efficient!
// No apologies, no refunds...
-(NSArray *)csvRows
{   
    NSMutableArray* outRows = [NSMutableArray array];

    NSCharacterSet* newlineCharSet = [NSCharacterSet newlineCharacterSet];
    NSCharacterSet* separatorCharactersSet = [NSCharacterSet characterSetWithCharactersInString:@","];

    NSArray* lines = [self componentsSeparatedByCharactersInSet:newlineCharSet];
    for ( NSString* line in lines )
    {
        if ( !line.length ) continue;
        NSArray* columns = [line componentsSeparatedByCharactersInSet:separatorCharactersSet];
        if ( columns.count )
        {
            [outRows addObject:columns];
        }
    }

    return outRows; // autoreleased
}

@end

Dies ist als eine Kategorie auf NSString definiert, um es zu verwenden, tun Sie einfach

NSMutableArray* myResponseAsArrayOfArraysOfStrings = [myCsvResponseAsAString csvRows];
for ( NSArray* row in myResponseAsArrayOfArraysOfStrings )
{
   for ( NSString* column in row )
   {
       NSLog( "%@", column );
   }
}

Ich hoffe, das hilft!

HINWEIS: Dieser Parser kann nicht mit Anführungszeichen umgehen. Nämlich 1. Wenn ein Feld in Anführungszeichen steht, werden die Anführungszeichen nicht entfernt. 2. Wenn der in Anführungszeichen gesetzte Teil ein Komma enthält, wird der Parser die Zeile falsch aufteilen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X