Pagina 1 di 1

[c] file sequenziale

MessaggioInviato: mer lug 07, 2004 12:25 pm
da sonep
se penso che non l'ho nemmeno capito io e devo spiegarlo!
comunque
sto costruendo un programma che dovrebbe trasferire i campi di un file sequenziale(creato in cobol) in un database...
io ho la lunghezza dei campi;
quindi ho pensato di prendermi l'intera riga e lavorarci su con substring, solo che il numero(che identifica la lunghezza del campo) che ho io(che fra l'altro è costante) è diverso da quello effettivo del file!
questo avviene perché vengono usati i <tab>!
bene quando il mio programma sul file incontra un <tab> lo riconosce come un unico carattere ma effettivamente, il <tab>, equivale ad 8 spazi(quindi caratteri!) e quindi nella variabile var vengono memorizzati sette caratteri di var2:
Es.

var0 = sr.ReadLine();
var = var0.Substring(0,9);//mettiamo che i primi 8 caratteri siano:
//"l<tab>" lui mi conta <tab> come 1 e prende anche var0.substring(8,8) che dovrebbero appartenere a var2
var2 = var0.substring(8,10);//qui chiaramente ripete un po' di var!!

quindi mi trovo sfalsato!
ho risolto inizialmente dichiarando nelle variabili

private string tab =" ";//l'equivalente del tab in c

e successivamente ho analizzato carattere per carattere e quando trovava il <tab> facevo avanzare un contatore di 8;
Es.

for (i=0;i<1;i++)
{
var = var0.Substring((x+k),1);
if (var==tab)
i=i+7;
varx= varx + var;
k++;
}
x=x+k;

ma anche questo non va perché può succedere che trovi 2 campi completamente vuoti e quindi il puntatore sfalsa!
spero abbiate capito il problema(o meglio che io mi sia fatto capire!)!
onestamente ho anche provato altre cose, ma è inutile postarle...visto che non hanno prodotto nessun tipo di risultato!

MessaggioInviato: mer lug 07, 2004 12:33 pm
da Robby78
nn sono sicuro di aver capito bene, ma se fai un

var0=replace(var0,tab," ");

e poi gestisci la var0 in maniera normale?

P.S. controlla la sintassi, nn sono molto pratico in c

MessaggioInviato: mer lug 07, 2004 12:53 pm
da sonep
è poco che lavoro in c....
quello che hai scritto sopra dovrebbe trasferire in var0 la stringa sostituendo i tab con " ". Giusto?
se fa questo non mi serve!
io ho una riga:

x00<tab>0r999<tab>

il cobol mi dice che la stringa è lunga 24(lo otteniamo da 3(x00)+8(<tab>)+5(0r999)+8(<tab>)
ma il mio programma mi da la stringa lunga come 10 (quindi 3+1+5+1)
il primo campo che a me serve e contenuto tra 0 e 3
quindi faccio
var=var0.substring(0,4);

tab in cobol(almeno per quanto ho capito) equivale ad 8 " ";
teoricamente dovrei avere var == a "x"+"0"+"0"+" "
in pratica ho var == a "x"+"0"+"0"+"<tab>"

MessaggioInviato: mer lug 07, 2004 1:09 pm
da Robby78
<blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">citazione:<hr height="1" noshade id="quote"><i>Messaggio inserito da sonep</i>
<br />quello che hai scritto sopra dovrebbe trasferire in var0 la stringa sostituendo i tab con " ". Giusto?
<hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">

nono, cioè si... insomma io avevo messo 8 spazi tra le virgolette, ma quando posto ne lascia 1 solo... puoi sostituire il carattere tab anche con + caratteri, non necessariamente 1.

Quindi il risultato dovrebbe essere
"x00[8 spazi]0r999[8 spazi]"
che rispekkia l'originale giusto?

MessaggioInviato: mer lug 07, 2004 2:46 pm
da sonep
giusto....nn ci avevo pensato...
sl che c'è un'altro problema...!
infatti i tab non sempre occupano lo stesso spazio(lo si può notare scrivendo con il word pad!
se premo solo <tab> si andrà ad occupare un sl carattere e se andiamo a verificare la lunghezza di quella riga ci risulterà uguale ad 1;
se invece scrivo "ciao<tab>" si andranno ad occupare 5 caratteri ma nello stesso spazio...quindi nel primo caso il tab occupa 8 ma nel secondo solo 2!

p.s.mi sta venendo qualche ciclo in mente per ovviare....
ci penso bene, compilo e posto! ci sentiamo dopo!

MessaggioInviato: mer lug 07, 2004 2:59 pm
da Robby78
ok! [^] occhio xò a nn sbatterti x niente; se cobol tratta i tab come 8 spazi è probabile che non sia sensibile alla posizione del cursore come accade normalmente, è possibile che siano sempre 8 spazi nel file ma che poi ci pensi l'editor a visualizzare le info correttamente...

MessaggioInviato: mer lug 07, 2004 3:23 pm
da sonep
[weponed][weponed][weponed]grande.....[8D][8D][8D]

sono andato un po' in fusione ma ci sono riuscito:

for (i=0;i<40;i++)
{
var=rec.Substring((x+k),1);
if (var==tab)
{
t=1;
i=i+(40-(i+1));
}
else
benef=benef+var;
k++;
}
x=x+k;
k=0;
while (rec.Substring((x+k),1)==tab)
{
t=t+1;
k=k+1;
}
if ((t*8)<30)
{
for (i=0;i<30;i++)
{
var=rec.Substring((x+k),1);
if (var==tab)
{
t=1;
i=i+(30-(i+1));
}
else
indir=indir+var;
k++;
}
x=x+k;
k=0;
}
for (i=0;i<5;i++)
ecc.ecc.

che ne dici...[afro](ora che ci faccio caso...era una c*****a)

comunque nn c'è un editor che faccia visualizzare le informazioni una volta rielaborate....vengono trasmesse al db e poi non interrogate più per l'eternità!

MessaggioInviato: mer lug 07, 2004 3:36 pm
da Robby78
bella lì!! [^]