lettura da file e tabulazione

  • Creatore Discussione Creatore Discussione mano
  • Data di inizio Data di inizio

mano

Nuovo Utente
3 Lug 2008
23
0
0
ciao,

vorrei capire come scrivere un codice corretto per leggere del testo e inserirlo in variabili/array/tabelle/database.

nello specifico ho il seguente problema.

leggo da file di testo dei dati tabulati con spazi. vorrei leggere tali dati ed inserirli nelle rispettive colonne di un database.

il testo è formato dai seguenti dati strutturati in tabella:

oggetto 1 X 4 (100 udm) for $1,200,000 luogo 1
oggetto 2 X 100 (1 udm) for $1,000 luogo 1
oggetto 3 X 2,053 (10 udm) for $24,000 luogo 2
...ecc...

le righe del DB saranno le seguenti:
ITEM QTY COST PLACE

per cui un esempio di raccolta dei dati è:
ITEM = oggetto 1
QTY = 4 (100 udm)
COST = 1,200,000
PLACE = luogo 1

fondamentalmente, la riga ITEM può essere un qualsiasi testo con numeri che precedono e seguono, anche separati da punti (es. "1.0 schermo"): in questo caso il separatore di colonna è lo spazio che segue o la X.

la riga QTY deve essere tutto ciò che segue la "X" (quindi x esclusa) e precede il "for".

la riga COST deve essere tutto ciò che segue il simbolo del "$" e precede lo spazio.

infine la riga place è l'ultimo testo che segue il numero COST. nota che strutturalmente è fatto come ITEM, cioè può contenere testo e numeri ma non si sa in che punto esatto della stringa...

ho dato un'occhiata alle espressioni regolari, ma non riesco a contestualizzarle nel mio problema, e non so se possano essere utilizzate in questo caso.

qualcuno ha qualche idea su come procedere?
grazie.
 
secondo me è un lavoro un po’lunghetto.
inoltre come sono suddivise le varie righe con CR o LF e tra una parola e l’altra c’è uno spazio solo?
io farei così

$riga = explode(chr(13), $testo); // se LF chr(10)
Per cui in
$riga[0] ho oggetto 1 X 4 (100 udm) for $1,200,000 luogo 1
$riga[1] ho oggetto 2 X 100 (1 udm) for $1,000 luogo 1
…ecc..

Prendo la riga 0 e la esplodo per spazio
$parte=explode(“ “,$riga[0]);
per cui avrò
$parte[0] = oggetto
$parte[1] = 1
$parte[2] = X
$parte[3] = 4 poi non so se tra 4 e ( c’è uno spazio
$parte[3]= ( oppure se tra ( e 100 c’è uno spazio
Se non c’è $parte[3]= (100
$parte[4]=udm se spazio oppure $parte[4]=udm)
$parte[5]=for
$parte[6]= $1,200,000 se non c’e spazio tr $ e cifra
Elimini $ con str_replace(“$”,””,$parte[6]);
$parte[7]=luogo
$parte[8]=1

A questo punto ricostruisci utilizzando quello che ti serve

$ITEM=$parte[0].” “.$parte[1];
ecc.. utilizzando quello che ti serve

Carichi in DB e riparti con la riga[1]

Tutto dipende comunque da come sono suddivise le varie righe e se tra le parole c'è uno o più spazi
Forse c’è qualche sistema migliore, ma a me è venuto in mente questo
 
potrebbe funzionare, borgo italia. gli spazi in genere sono fissi. il problema sono i nomi dell'oggetto e del luogo. infatti per quanto riguarda gli oggetti ci può essere un numero che precede e l'oggetto è costituito da due nomi.

per es.: "1.0 schermo lcd"

penso che in quel caso il vero limitatore sia la "X".
facendo nel tuo modo, potrei effettivamente dividere la riga in:
$word[0] = "1.0";
$word[1] = "schermo";
$word[2] = "lcd";
$word[3] = "X";

però nel ricostruirla, come faccio a dirgli di unire tutte le stringhe $word[] fino a quella contenente "X" ?

potrei fare così?

for ( $i = 0; $i < sizeof($word) ; $i++){
while ($word[$i]!="X"){
$pezzi[$i] = $word[$i];
}
}

$ITEM = implode (" ",$pezzi);
 
Ultima modifica:
potresti

dopo aver esploso la riga con CR o LF

$dueParti=explode("X", $riga[0]);
in $dueParti[0] dovresti trovarti l'oggetto (eventualmente usa anche trim())

in $dueParti[1] tutto il resto da trattare come gia indicato

salvi in DB e poi riparti da $riga[1]..ecc..;

questo se hai una sola X per riga
 
si, di X ne una sola. potrei fare una serie sequenziale di explode:

la prima con X e mi ritrovo l'oggetto e il resto, poi esplodo il resto con il for per trovarmi la quantità, poi con lo spazio per trovarmi il prezzo e il luogo...

ora provo. se funzia ti faccio sapere.

intanto, grazie per le dritte ;)
 
un'altra soluzione potrebbe essere creare un CSV dal file di testo e importarlo con un LOAD DATA
 
be', in teoria i dati posso tranquillamente importarli in excel...

come potrei usare load data? non conosco questa funzione...
 
cia avatar deminiaco
la cosa interessa anche me
ma se faccio il CSV (se non erro usa le virgole come separatore?)
ed ho es come detto da mano:
"1.0 schermo lcd"
e
"pincopallo lcd"

nel primo caso ho tre campi (?) nel secondo 2?
 
per ora ho risolto in modo diciamo poco ortodosso, modificando il file da analizzare inserendo come elemento di tabulazione un asterisco *. poi con lo script esplodo rispetto all'asterisco.

con i files csv, non c'è modo di specificare l'elemento di tabulazione?
perchè alla fine, anche le parole composte (che si trovano nel file da analizzare) con spazi e virgole, rientrano in un'unica colonna. mi spiego meglio:

COLONNA1 - COLONNA2 - ...
1.0 schermo LCD - 10 elementi - ...

per cui se si potesse usare nel csv un elemento diverso dalla virgola (perchè è usata come indicatore delle migliaia nei costi) sarei a cavallo... :)
 
proprio ieri ho caricato 8880 indirizzi e mail che avevo su excel nel db per news.
io ho fatto così:
1.copiata colonne excel in word
2. in word convertito tabella in testo delimita con *
3. sostituito ^p con *
4. copia incolla in campo form e salva
5. $campi=explode("*", $testo_da_form);
nello script ho calcolato grandezza di $campi[] da cui sapendo quanti campi ho nella tab del DB
$incremento=$grand_campi / $num_campi_tab;// es per tre campi

for ($k=0, $k<$incremento; $k=$k+3){
$q="INSERT INTO tabella c1, c1,c3 VALUE ($cami[$k], $campi[$k+1], $campi[$k+2];
..........
}

tutto è andato a buon fine, con 10 minuti di lavoro
:byebye:
 

Discussioni simili