FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Manejo de archivo cvs
Hola que tal buenos días soy nueva en esto de Builder C++.... mi pregunta es la siguiente, tengo un archivo CVS el cual deseo pasar a una base de datos que ya tengo.
He utilizado lo siguiente: 1.- En un TMemo, paso el contenido de mi archivo separado por comas, y enseguida cada una de las lineas del Memo lo manejo como una cadena por separado donde utilizo un TStringList con el siguiente código Código Delphi [-] if (Memo->Lines->Count <=0) ShowMessage ("Primero debe seleccionar un archivo"); else { TStringList *SL = new TStringList; AnsiString cadena; int i,contador=Memo->Lines->Count; for (i=1; i<=contador; i++) { cadena=Memo->Lines->Strings[i]; SL->CommaText = cadena; DM->Proveed->Insert(); int cantidad = SL->Count; // La cantidad de componentes for (int fila=0; fila < cantidad; fila++) { Memo1->Lines->Add(SL->Strings[fila]); if (fila==0) DBEdit1->Text=SL->Strings[fila]; if (fila==2) DBEdit2->Text=SL->Strings[fila]; if (fila==8) DBEdit8->Text=SL->Strings[fila]; } DM->Proveed->Post(); } ShowMessage("ARCHIVO EXPORTADO....."); } Como se puede notar yo intente controlarlo con un If, y que cuando sea la segunda linea (nombre) me lo ponga en mi dbEdit pero el problema que tengo es que aquí no me separa por comas, si no por palabras, y si yo tengo el archivo con la siguiente estructura CLAVE,NOMBRE,DIRECCION,TELEFONO 0001,GERARDO PEREZ GALINDO, GALEANA 211, 3949588 0020,AGUSTIN LOPEZ MENDOZA, MINA 344, 3948588 La separación sería: 001 GERARDO PEREZ GALINDO GALEANA 211 3949588 y no puedo identificar cuántas líneas corresponden al nombre y cuantas a dirección, etc etc.... Espero alguien me pueda decir una mejor forma de realizar esto... muchas gracias |
#2
|
||||
|
||||
Código:
if (Memo->Lines->Count <=0) ShowMessage ("Primero debe seleccionar un archivo"); else { TStringList *SL = new TStringList; AnsiString cadena; int i,contador=Memo->Lines->Count; for (i=1; i<contador; i++) { cadena=Memo->Lines->Strings[i]; SL->CommaText = cadena; DM->Proveed->Insert(); int cantidad = SL->Count; // La cantidad de componentes for (int fila=0; fila < cantidad; fila++) Memo1->Lines->Add(SL->Strings[fila]); DBEdit1->Text=SL->Strings[0]; DBEdit2->Text=SL->Strings[2]; DBEdit8->Text=SL->Strings[8]; } DM->Proveed->Post(); } ShowMessage("ARCHIVO EXPORTADO....."); }
__________________
self.free; Última edición por dec fecha: 30-05-2007 a las 08:46:54. |
#3
|
||||
|
||||
Me parece GLGB que vas a tener que elaborar más. El problema es que la propiedad CommaText, como ya observaste, divide no sólo por comas sino también por espacios.
Lo ideal sería que los campos en el archivo CSV estuviesen delimitados, por ejemplo: Código:
"0001","GERARDO PEREZ GALINDO", "GALEANA 211", "3949588" "0020","AGUSTIN LOPEZ MENDOZA", "MINA 344", "3948588" 1. buscas la primera coma y apuntas su posición 2. copias la parte de la cadena desde el principio hasta esa posición 3. borras dela cadena la parte recién copiada 4. repites los pasos anteriores mientras la cadena no esté vacía. Esta es la idea. No pongo un código más explícito porque desconozco las funciones en C que hacen eso, pero creo que puedes partir de ahí. // Saludos |
#4
|
|||
|
|||
Hola.... pues si creo que si voy a tener que crear un algoritmo que vaya recorriendo uno a uno los caracteres....
Intente hacer lo siguiente:
Pero no me funciona, todo me lo pone en el DBEdit1, no se bien como hacer la separación de cadenas, alguien que me pueda echar la mano??? |
#5
|
|||
|
|||
AAhh ahi en los ifs le tengo de la siguiente manera:
if (flag==1) ....... if (flag==2) ....... if (flag==3) ....... osea q si le tengo doble == solo q en el anterior post se me paso ponerlo |
#6
|
||||
|
||||
Algo que se me ocurre, un poco jalado de los pelos, pero que te permitiría usar la idea original, sería completar el CSV con los delimitadores conforme procesas cada línea
Código:
cadena = Memo->Lines->Strings;
Así, conviertes 0020,AGUSTIN LOPEZ MENDOZA, MINA 344, 3948588 en "0020","AGUSTIN LOPEZ MENDOZA"," MINA 344"," 3948588" con lo que puedes aplicar lo de CommaText sin problemas. // Saludos |
#7
|
|||
|
|||
Entonces si se demilita por "1234","lucero","2332" el CommaText ya lo separará como yo quiero??Ya probé el código q me dice, pero me marca un error sintaxis y como yo nunca he usado esta función no se si me pudiera echar la mano...
|
#8
|
||||
|
||||
Así es, CommaText te separará ahora sólo por las comas. Hay un error en el código que puse. Debería ser
en lugar de
En C habrá que ajustar porque las " se usan para las cadenas a diferencia de delphi que usa el apóstrofe '. // Saludos |
#9
|
||||
|
||||
No se olviden de los siguientes detalles:
Mi componente FileReader, tiene la lógica para "desmenuzar" un CSV. Nunca he publicado el código porque fue de las primeras cosas que hice en Delphi y creo que si lo veo ahora debe ser vergonzoso. Si estoy seguro que funciona sin problemas, ya que lo he utilizado en infinidad de aplicaciones. Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#10
|
||||
|
||||
Había pensado en eso, pero ¡qué exigentes eres!
La verdad es que tienes razón y habría que cubrir todos los casos. La componente que mencionas, ¿vas a publicar su código? Porque habría que traducirlo a C. // Saludos |
#11
|
||||
|
||||
Bueno, no creo que a los de borland les importe mucho que partiendo del método SetDelimitedText y recortando aquí y allá, lleguemos a esto:
Por ejemplo: Seguimos teniendo que traducirlo a C, pero teniendo en cuenta que se hace un uso intensivo de punteros, creo que el paso a C tendría que ser sencillo. PD: Creo que ya lo dije antes, pero en el nuevo turbo la propiedad StrictDelimiter soluciona este problema. Última edición por seoane fecha: 30-05-2007 a las 19:46:40. |
#12
|
||||
|
||||
Cita:
// Saludos |
#13
|
||||
|
||||
Por cierto, donde dices SetDilimitedText, ¿no quieres decir SetDelimitedText?
// Saludos |
#14
|
||||
|
||||
Cita:
|
#15
|
|||
|
|||
Gracias por sus sugerencias, de hecho se me hizo un poco complicado conl a solución que me dieron, además que seguí trabajando con el código que ya tenía. Ya me función y está en Builder, x si a alguien le sirve
Gracias a todos!!! y espero les sirva de algo mi código.... |
#16
|
||||
|
||||
Bonita solución GLGB, aunque debes de tener cuidado de que no aparezcan comas en el medio de uno de los campos. De todas formas si estas seguro de que eso nunca va a ocurrir, la solución parece eficaz.
Por cierto, ya que hablamos de cvs, hace poco puse en mi pagina web un pequeño código para manipular ese tipo de ficheros. Permite modificar el delimitador, las comillas, el número de campos y su orden. http://delphi.jmrds.com/?q=node/28 Por si a alguien le interesa ... |
#17
|
|||
|
|||
Gracias.. lo tomare en cuenta por si algo falla con mi algoritmo!!
Saludos |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Filosofia/Manejo archivo "cds" Archivo.cds!! | Martín González | Conexión con bases de datos | 1 | 03-05-2007 00:14:23 |
Manejo de una DLL | guiweb | Varios | 4 | 30-06-2006 15:10:48 |
Manejo de Archivo, Consulta?? | marceloalegre | Varios | 2 | 07-11-2005 15:29:40 |
manejo de BD | raco | Varios | 0 | 21-07-2005 00:25:33 |
manejo de .dbf en delphi | jeni | Conexión con bases de datos | 2 | 14-09-2003 02:09:42 |
|