FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Leer una cierta cantidad de caracteres de una archivo.
Hola gente:
por empezar se agradece que estén leyendo este hilo y cualquier repuesta. Supongo que lo que tengo que hacer no es muy dificil pero estoy buscando y realmente no encuentro nada. La cosa es así: necesito leer un archivo pero de a 160 caracteres. Tengo un archivo .dat en el cual cada registro que tengo que leer tiene 160 caracteres y dentro de esos registros cada campo tiene una longitud en particular. Yo lo que necesito saber es como hago para leer los primeros 160 caracteres del archivo (dentro de esto los 2 primeros caracteres, después los 2 siguiente y sucesivamente), después los otros 160 caracteres del archivo, y así sucesivamente hasta el final. Estaría agradecido si alguien me puede brindar alguna función o tipo de código en donde se abra un archivo y se lea de la manera que se necesito. Espero haberme expresado bien. Otra vez gracias. Mariano. |
#2
|
||||
|
||||
Código:
public { Public declarations } strlist : TStringList; procedure TForm1.FormCreate(Sender: TObject); begin Strlist:= TStringList.Create; end; procedure TForm1.Abrir1Click(Sender: TObject); begin if (opendialog1.Execute) then begin strlist.LoadFromFile(opendialog1.FileName); end; end; procedure TForm1.FormDestroy(Sender: TObject); begin strlist.Free; end; procedure TForm1.actualizarStringGrid; var I:integer; temp: string; begin for I:=1 to StringGrid1.RowCount do StringGrid1.Rows[i].clear; for I:= 0 to (strlist.count)-1 do begin temp:= strlist.Strings[i];// Aca serian los primero 160 caracteres StringGrid1.Cells[0,I+1]:= copy(temp,1,8); // en cada una de estas filas copias la parte que quieras de los 160 StringGrid1.Cells[1,I+1]:= copy(temp,9,8); StringGrid1.Cells[2,I+1]:= copy(temp,17,4); StringGrid1.Cells[3,I+1]:= copy(temp,21,1); StringGrid1.Cells[4,I+1]:= copy(temp,22,10); ...... StringGrid1.RowCount:=StringGrid1.RowCount+1; end; end; Última edición por juanlaplata fecha: 18-12-2007 a las 15:09:07. |
#3
|
|||
|
|||
Hola...
El archivo está en formato de texto plano? Por que si es así, la solución que te da juanlaplata te puede servir, de otra forma, tendrías que usar otro método... Saludos... |
#4
|
|||
|
|||
Solución
Cita:
Código:
function TForm1.insertarRegistrosEnTAP2_CDRs(SRuta: String; id_archivo: integer; OraConn:TADOConnection): integer; var Arch: TextFile; rsResultCDRs:TADOQuery; ArchivoEntero, insertCDR, Registro, Campo1, Campo2, Campo3, Campo4, Campo5, Campo6, Campo7, Campo8, Campo9, Campo10, Campo11, Campo12, Campo13, Campo14, Campo15, Campo16, Campo17, Campo18, Campo19, Campo20, Campo21, Campo22, Campo23, Campo24, Campo25, Campo26, Campo27, Campo28, Campo29, Campo30, Campo31, Campo32: String; i,cnt: integer; Seguir: Boolean; begin cnt := 0; Campo1 := '0'; AssignFile(Arch,SRuta); Reset(Arch); i := 1; readln(Arch,ArchivoEntero); Seguir := True; while Seguir do begin Registro := Copy(ArchivoEntero,i,160); Campo1 := Copy(Registro,1,2); if (Campo1 = '90') then Seguir := False else begin if ((Campo1 = '20') or (Campo1 = '30') or (Campo1 = '40')) then begin rsResultCDRs:=TADOQuery.Create(nil); rsResultCDRs.Connection:=OraConn; Campo2 := Copy(Registro,3,6); if Campo2 = '' then Campo2 := ''''; Campo3 := Copy(Registro,9,1); if Campo3 = '' then Campo3 := ''''; Campo4 := Copy(Registro,10,15); if Campo4 = '' then Campo4 := ''''; Campo5 := Copy(Registro,25,16); if Campo5 = '' then Campo5 := ''''; Campo6 := Copy(Registro,41,1); if Campo6 = '' then Campo6 := ''''; Campo7 := Copy(Registro,42,1); if Campo7 = '' then Campo7 := ''''; Campo8 := Copy(Registro,43,1); if Campo8 = '' then Campo8 := ''''; Campo9 := Copy(Registro,44,21); if Campo9 = '' then Campo9 := ''''; Campo10 := Copy(Registro,65,1); if Campo10 = '' then Campo10 := ''''; Campo11 := Copy(Registro,66,2); if Campo11 = '' then Campo11 := ''''; Campo12 := Copy(Registro,68,1); if Campo12 = '' then Campo12 := ''''; Campo13 := Copy(Registro,69,2); if Campo13 = '' then Campo13 := ''''; Campo14 := Copy(Registro,71,1); if Campo14 = '' then Campo14 := ''''; Campo15 := Copy(Registro,72,1); if Campo15 = '' then Campo15 := ''''; Campo16 := Copy(Registro,73,1); if Campo16 = '' then Campo16 := ''''; Campo17 := Copy(Registro,74,15); if Campo17 = '' then Campo17 := ''''; Campo18 := Copy(Registro,89,15); if Campo18 = '' then Campo18 := ''''; Campo19 := Copy(Registro,104,5); if Campo19 = '' then Campo19 := ''''; Campo20 := Copy(Registro,109,5); if Campo20 = '' then Campo20 := ''''; Campo21 := Copy(Registro,114,1); if Campo21 = '' then Campo21 := ''''; Campo22 := Copy(Registro,115,6); if Campo22 = '' then Campo22 := ''''; Campo23 := Copy(Registro,121,6); if Campo23 = '' then Campo23 := ''''; Campo24 := Copy(Registro,127,1); if Campo24 = '' then Campo24 := ''''; Campo25 := Copy(Registro,128,6); if Campo25 = '' then Campo25 := ''''; Campo26 := Copy(Registro,134,6); if Campo26 = '' then Campo26 := ''''; Campo27 := Copy(Registro,140,9); if Campo27 = '' then Campo27 := ''''; Campo28 := Copy(Registro,149,1); if Campo28 = '' then Campo28 := ''''; Campo29 := Copy(Registro,150,1); if Campo29 = '' then Campo29 := ''''; Campo30 := Copy(Registro,151,1); if Campo30 = '' then Campo30 := ''''; Campo31 := Copy(Registro,152,6); if Campo31 = '' then Campo31 := ''''; Campo32 := Copy(Registro,158,13); if Campo32 = '' then Campo32 := ''''; cnt := cnt + 1; lblestado.Caption:='Estado: Insertando registro detalle ' + intToStr(cnt) + ' en TAP2_CDRS'; lblestado.Refresh; insertCDR := 'insert into TAP2_CDRS values(seq_tap2_cdrs.nextval,'+intToStr(id_archivo)+',sysdate,'''','+Campo1+','''+Campo2+''','''+Campo3+''','''+Campo4+''','''+Campo5+''','''+Campo6+''','''+Campo7+''','''+Campo8+''','''+Campo9+''','''+Campo10+''','''+Campo11+''','''+Campo12+''','''+Campo13+''','''+Campo14+''','''+Campo15+''','''+Campo16+''','''+Campo17+''','''+Campo18+''','+Campo19+','+Campo20+','+Campo21+','''+Campo22+''','''+Campo23+''','''+Campo24+''','+Campo25+','+Campo26+','+Campo27+','''+Campo28+''','+Campo29+','''+Campo30+''','''+Campo31+''','''+Campo32+''')'; rsResultCDRs.SQL.Add(insertCDR); rsResultCDRs.ExecSQL; rsResultCDRs.Close; rsResultCDRs.Destroy; end; end; i := i + 160; end; CloseFile(Arch); Result := cnt; end; |
#5
|
|||
|
|||
Insertar campos de longitud variable
Hola a todos, me ha servido mucho este hilo, solo que mis campos no son de longitud fija y estan separados por espacio, en este caso como los puedo ir insertando en la base de datos.
Se me ocurrio ir leyendo por palabra e irlo insertando, puedo hacer un ciclo con el pos hasta que encuentre un espacio?? |
#6
|
||||
|
||||
claro!
En ocasiones he hecho algo como esto:
Quizás compile y quizás funcione... lo he escrito acá mismo, pues no tengo delphi a mano ahora, pero espero te de una idea. Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#7
|
|||
|
|||
Hola, gracias por responder ya lo probe y me marca un error en la parte de
Campo1 := ExtraeSiguientePalabra(Linea); El error es Too Many actual parameters. Disculpa la ignorancia pero soy novata. |
#8
|
||||
|
||||
No tengo delphi a mano... pero ¡no puede ser! ¿estas segura de eso?
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#9
|
|||
|
|||
Si, ese es el error que me marca.
Este es el código tal cual lo puse, aun no he hecho la parte de insertarlo en la bd. unit funcion; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); function ExtraeSiguientePalabra: string; private { Private declarations } public { Public declarations } end; var Form1: TForm1; Lineas: TStringList; Linea, Campo1, Campo2: string; I:integer; implementation {$R *.DFM} function ExtraeSiguientePalabra(var S: string): string; begin if pos(' ', S) <> 0 then begin Result := copy(S, 1, pos(' ', S) -1); Delete(S, 1, length(Result) + 1); //si cabe la posibilidad que haya mas de un espacio separando: S := Trim(S); end else begin Result := S; S := ''; end; end; procedure TForm1.Button1Click(Sender: TObject); begin Lineas := TStringList.Create; try Lineas.LoadFromFile('c:\pruebaleer.txt'); for I:= 0 to Lineas.Count - 1 do begin Linea := Lineas[i]; Campo1 := ExtraeSiguientePalabra(Linea); Campo2 := ExtraeSiguientePalabra(Linea); //HacerAlgoConLosCampos(Campo1, Campo2); end; finally Lineas.Free; end; end; end. Gracias |
#10
|
|||
|
|||
Otra opción
Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney Última edición por egostar fecha: 23-01-2008 a las 01:09:02. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
como leer n caracteres de un archivo | manolop | Varios | 6 | 18-12-2007 22:50:06 |
Saber cantidad de lineas que se van a leer de un fichero texto... | Lester | Varios | 4 | 04-04-2007 17:57:02 |
Select y cantidad de caracteres | Walterdf | SQL | 8 | 28-07-2006 13:21:48 |
mostrar el cantidad maxima de caracteres en un memo | Choclito | Varios | 1 | 03-05-2006 18:10:28 |
Cantidad de caracteres en un edit | botones67 | Varios | 4 | 09-07-2003 11:55:54 |
|