2012-04-18 48 views
5

Soy nuevo en la codificación, así que discúlpeme si esto parece una pregunta simple.Crear una matriz a partir de un archivo CSV utilizando el objetivo C

Intento trazar las coordenadas en un mapa.

Quiero leer un archivo CSV y pasar la información a dos matrices separadas.

La primera matriz será NSArray * towerInfo (que contiene latitud, longitud y título torre)

la segunda, NSArray * región (que contiene título torre y región) con el mismo índice de recuento como la primera matriz.

Esencialmente, creo que necesito hacerlo;

1) leer el archivo en una cadena .....

2) dividir la cadena en una matriz temporal que separa a cada/n/r ......

3) bucle a través de la matriz temporal y crear un objeto de torre y región cada vez antes de agregar esta información a las dos matrices de almacenamiento principal.

¿Es este el proceso correcto? Si es así, ¿hay alguien por ahí que pueda publicar un código de muestra ya que realmente estoy luchando para hacerlo bien?

Gracias a todos por adelantado.

Chris.

He editado esto para mostrar un ejemplo de mi código. Tengo el problema de que estoy recibiendo advertencias diciendo

1) "la declaración local de 'dataStr' oculta la variable de instancia 2)" la declaración local de 'matriz' oculta la variable de instancia.

Creo que entiendo lo que estos significan pero no sé cómo evitarlo. El programa se compila y se ejecuta, pero el registro me dice que la "matriz es nula".

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

@synthesize dataStr; 
@synthesize array; 

-(IBAction)convert { 
//calls the following program when the onscreen 'convert' button is pressed. 

    NSString *dataStr = [NSString stringWithContentsOfFile:@"Towers.csv" encoding:NSUTF8StringEncoding error:nil]; 
    //specifies the csv file to read - stored in project root directory - and encodes specifies that the format of the file is NSUTF8. Choses not to return an error message if the reading fails 

    NSArray *array = [dataStr componentsSeparatedByString: @","]; 
    //splits the string into an array by identifying data separators. 

    NSLog(@"array: %@", array); 
    //prints the array to screen 

} 

Cualquier ayuda adicional sería muy apreciada. Gracias por las respuestas hasta el momento.

+0

primero que tiene que hacer alguna cosa por su lado y si u atrapado en algún lugar entre esos intentos Código Postal y entonces podemos ayudar a salir tan buena suerte con sus intentos –

+0

¿puede dar un par de ejemplos de líneas del archivo CSV y explicar que la información es? – NSGod

Respuesta

6
NSString* fileContents = [NSString stringWithContentsOfURL:filename ...]; 
NSArray* rows = [fileContents componentsSeparatedByString:@"\n"]; 
for (... 
    NSString* row = [rows objectAtIndex:n]; 
    NSArray* columns = [row componentsSeparatedByString:@","]; 
... 

es probable que desee lanzar en unos pocos "stringTrimmingCharactersInSet" llamadas para recortar espacios en blanco.

0

Supongo que el núcleo de su pregunta es "cómo analizar un archivo CSV", no "qué hacer con los datos una vez que se haya analizado". Si ese es el caso, entonces mira la biblioteca CHCSVParser. Lo he usado en proyectos antes y lo encuentro muy confiable. Puede analizar cualquier cadena arbitraria o ruta de archivo en un NSArray de filas/columnas por usted. Después de eso, cualquier cosa que hagas con los datos depende de ti.

1

con respecto a su advertencias:

Su código produciría un error (no una advertencia), ya que se necesita para declarar sus propiedades en el archivo de interfaz antes de que sintetizar en la implementación. Probablemente recuerde que @synthesize genera métodos de acceso para sus propiedades. Además, antes de utilizar la directiva @synthesize, debe utilizar la directiva @property, también en la interfaz. He aquí un ejemplo:

@interface MyObject : NSObject { 
    NSString *myString; 
} 
@property (assign) NSString *myString; 
@end 

@implementation MyObject 
@synthesize myString; 
    // funky code here 
@end 

Tenga en cuenta que la declaración de propiedad es seguido por un tipo (asignar en este caso, que es el valor por defecto). Hay una excelente explicación de esto en el libro de Stephen G. Kochans: Programming in Objective-C 2.0


Pero suponiendo por mor del argumento, que omite el archivo correcto @interface aquí. Si se declara por primera vez una propiedad en el @interface, y luego declara otra propiedad en su método, utilizando el mismo nombre de variable, la variable método tendrá prioridad sobre la variable de instancia.

En su código, que sería suficiente para omitir el que se declara del nombre de la variable, así:

dataStr = [NSString stringWithContentsOfFile:@"Towers.csv" encoding:NSUTF8StringEncoding error:nil];  
array = [dataStr componentsSeparatedByString: @","]; 
Cuestiones relacionadas