Newsgroup: it.comp.lang.visual-basic
Titolo: [HELP] File Ascii

Salve a tutti,
Stò lottando da qualche settimana con una conversione di dati BTRIEVE che ha
campi packed, sono riuscita ad esportare i dati richiesti in ascii e
utilizzando  MBFIEE32.DLL a convertire in importi visibili questi campi.
Il problema è che alcuni di questi campi (hanno tutti lunghezza di 8
posizioni) hanno un carattere vuoto che sono riuscita a decifrare in
esadecimale a "A0" e altri a cui mancano le prime posizioni e bisogna
rimpiazzare con gli 0.
Succede una cosa troppo bella: sistemo manualmente i campi che necessitano
degli 0 iniziali inserisco e salvando il file e come se perdesse il
carattere A0 così che quei record non riesco più a convertirli....
Ma non finisce qui: il file ha 1400 record....me ne esporta solo un
centinaio. Cioè va in fine file prima che lo sia davvero (uso l'istr. OPEN
in modo sequenziale)
Non ne vengo fuori!!!
Grazie a chi mi aiuterà :)
mariagrazia


Se il file contiene degli zeri binari non è proprio "ASCII": devi aprirlo For
Binary e non For Input.
Bye
Raf
-----------------------------------------------------
Funk: cooler than the other side of the pillow.

macchè nulla ... anche aprendolo con For  Binary se ne frega dei caratteri
NULL e mi sfasa tutte le posizioni dei campi....
:(((
"Rafunk" <rafun...@NOTHANKSlibero.it> ha scritto nel messaggio
news:e7dt9a$dmg$1...@alix.livenet.it...


 :(((
Eh, ma come lo leggi? Un byte alla volta, un blocco alla volta, tutto in una
volta...
Ciao
Raf

leggo la riga intera (299 chr) e poi con mid prendo solo quello che mi
serve....
mumble
ciao
"Rafunk" <rafun...@NOTHANKSlibero.it> ha scritto nel messaggio
news:e7ghum$uf4$1...@alix.livenet.it...


 ciao
Già... mmmmmm...
Forse potrei aiutarti meglio se tu (oltre a quotare correttamente ;-) scrivendo
*sotto* il testo) mi facessi vedere il pezzo di codice che apre, legge il file
ed estrae i "campi" con MID!
Ciao


Questo è un esempio del file ascii su cui lavoro:
19960006520002090201     @…ëQ¸`vŽdescrizione
00000000031996123100000000(\ Âõ¾7Žèz ®G‰$Žèz ®G‰$Žèz ®G‰$Ž003  0000000
1 @…ëQ¸`vŽ                 000000000000000000  00  1996010119961231
1996000652002209020100306x ®Gáú descrizione00000000031996123100000000
x ®Gáú Šx ®Gáú Šx ®Gáú Š000  0000000                0   ®Gáú Š
000000000000000000  00  0000000000000000
1996000652003209020100103°Gáz   ‰descrizione00000000031996123100000000
°Gáz   ‰°Gáz   ‰°Gáz   ‰000  0000000                0 °Gáz   ‰
000000000000000000  00  0000000000000000
- la lunghezza di ogni record è di 299 chr
- i campi packed che vedi sono di 8 chr visibili , ma in alcuni casi sono
composti da 1 chr (0A)=LF o NULL seguiti dai restanti chr visibili.
- gli spazi vuoti che vedi tra i vari campi sono NULL
In sostanza il mio problema è che vb (ho provato anche con excel per vedere
cosa mi dava) ho bisogno che i campi packed siano di 8 chr per poterli
convertire,
e quando leggo la riga lui non tiene conto dei NULL ma unisce i campi.
il codice che uso è:
  Dim campo1 As String
   Dim campo2 As String
   Dim campo3 As String
   Dim campo4 As String
   Dim campo6 As String
   Dim campo7 As String
   Dim campo8 As String
   Dim Campo9 As String
   Dim MbfRecord As Ruling
   Dim TextString As String * 10
  Dim MyString As String
   Dim MyPacked1 As String
   Open "MIO" For Input As #1                  'provato già anche con for
binary
   Open "prova" For Output As #2
    Do While Not EOF(1)
     Input #1, MyString
     campo1 = Left$(MyString, 20)
     campo2 = Mid$(MyString, 21, 5)
     Open "APP" For Output As #3
     MyPacked1 = Mid(MyString, 26, 8)
     Print #3, MyPacked1
     Close #3
     Open "APP" For Random As #3
     Get #3, 1, MbfRecord
     DxToIEEEd MbfRecord.X1
     Close #3
     RSet TextString = Format(MbfRecord.X1, "#,##0.00")
    campo3 = Mid$(MyString, 34, 60)
     campo4 = Mid$(MyString, 94, 13)
     campo6 = Mid$(MyString, 107, 39)
     campo7 = Mid$(MyString, 147, 25)
etc etc...
   Print #2, campo1; campo2; Spc(2); TextString; Spc(2); campo3; Spc(2);
campo4; Spc(2); campo6; campo7 ' giusto un esempio
   Loop
  Close #1
  Close #2
ciao

      Input #1, MyString
Ricorda che con For Binary devi usare Get e non Input!
MyString = Space(LunghezzaRecord)
Get #1,, MyString
Ciao
Raf


fatto! sembra tenere conto dei null perň....
non capisco perchč quando mi legge il secondo record inizia con dei
quadratini che non ci sono e sfasa tutto....
ciao

 ciao
Probabilmente LunghezzaRecord non è quella giusta. Forse i "quadratini" sono
caratteri tipo CR ed LF che delimitano i vari record e tu non ne hai tenuto
conto.
Se ancora così non si risolve %-( , mandami il file come allegato che ci guardo.


 Bye
sicuramente il problema è dato dalla lunghezza record non corretta, ma scusa
l'ignoranza come faccio a tenere conto dei caratteri CR e LF che ti confermo
esserci? Anzi ti dirò di più ogni tanto ricorrono campi paked che hanno
all'interno degli 8 chr LF ....
thanx

 campi paked che hanno all'interno degli 8 chr LF ....
Di quelli in posizione fissa ne devi tenere conto nella lunghezza EFFETTIVA del
record, che allora sarà 301 = 299 bytes di soli dati + CR + LF a quanto mi
sembra di capire.
Degli altri non preoccupartene, fanno parte dei "dati".
Ciao


 Degli altri non preoccupartene, fanno parte dei "dati".
la storia infinita prosegue.. comunque credo di essere arrivata quasi alla
fine spero...
ho controllato il file con un editor esadecimale ed effetticamente come
suggerivi tu sbagliavo la lunghezza del record.
Ora viene il bello: le prime due righe sono lunghe 302, la terza 301! poi
riprende ...
mi sembra di capire che ci siano righe a lunghezza differente...
ma com'è possible??? Non dirmi che devo editarmi manualmente la bellezza di
1400 record per uniformare la cosa.... :(
ciao


Ah, son dolori! Un file binario con record di lunghezza variabile... ma quale
programma l'ha generato?!
Ma poi sei sicura di riuscire ad "interpretare" correttamente il tracciato se di
lunghezza diversa da quella attesa?
L'unica idea che mi viene in mente è intercettare le coppie CRLF (0D0A) che a
quanto pare delimitano i record, gestendo adeguatamente anche il caso in cui la
coppia appaia anche "in mezzo" al record, magari in uno dei valori binari.
Una traccia di algoritmo, buttato giù a braccio (=senza provarlo):
1) Leggi tutto il file memorizzandolo in una stringa buffer (quindi in un colpo
solo, non preoccuparti se il file è lungo circa 420K):
    f = Freefile
    Open MyFileName For Binary As f
    Buffer = Space(LOF(f))
    Get #f,, Buffer
    Close f
2) Trasformi il buffer in un array di stringhe "record" presunti, usando la
funzione Split
    Dim Records() As String
    Records = Split(Buffer, vbCrLf)
3) Scorri l'array per effettuare le conversioni, verificando però che non ci
siano record di lunghezza anomala (cioè minore della lunghezza minima attesa, ad
esempio), derivanti da un'errata "interpretazione" di un CRLF non effettivo
delimitatore di record.
In tal caso il record andrà probabilmente "fuso" col successivo (o coi
successivi):
    For i = LBound(Records) To UBound(Records)
        sRecord = Records(i)
        Do While (Len(sRecord) < MinLength) And (i < UBound(Records))
            i = i + 1
            sRecord = sRecord & vbCrLf & Records(i)
        Loop
        Call ProcessaRecord(sRecord) ' <- Tua funzione ad hoc che processa il
record, scompattandone i campi binary etc. etc.
    Next i
Ciao
Raf


 programma l'ha generato?!
un bel programma arcaico che usa BTRIEVE! ...
adesso faccio un pò di prove e ti faccio sapere.... nel frattempo: GRAZIE :)
ciao

     Buffer = Space(LOF(f))
mi dà errore 458 :((


Ma non è che ti conveniva trovare un OLEDB provider che supporti il formato
BTRIEVE e usare ADO per accedere alla tabella?



mmmm e i campi packed chissà se sarebbero visibili... tutto questo caos
nasce perchè devo convertire quelli..
tra parentesi adesso mi devo recuperare vb6 per usare la funzione split....

 ma in VB5 esiste la funzione SPLIT? nell'help non l'ha trovata....
NO.
-- 
You have junk mail.
News 2000 [v 2.06] - 
http://www.akapulce.net/socket2000

 BTRIEVE e usare ADO per accedere alla tabella?
ho risolto tutto con il preziosissimo codice che mi hai dato e usando vb6
adesso che ho più tempo, cerco di percorrere anche la strada OLEDB....
grazie ancora per la pazienza e l'aiuto. :))
ciao

 ciao
Prego, ciao!
