Benvenuto Visitatore ( Log In | Registrati )
![]() ![]() |
1 Jul 2004, 22:17
Messaggio
#1
|
|
|
[list]'Sta volta e' una cosa creativa.....
Ho un file "xxx.txt" da aprire e leggere ( fatto.....); Con quanto letto devo costruire tabelle a elementi indipedenti da post -processare indipendentemente l'uno dall'altro..... La lettura prende delle stringhe che a priori,non so come terminino,quante siano e neppure come siano fatte.... Ogni stringa e' una linea ...... Ogni linea e' formata da sottostringhe delimitate da virgole.... Le sottostringhe,a loro volta,sono di tre tipi diversi: 1.-nessun delimitatore intermedio (esempio "prova" oppure "23654").... 2.-sono date(esempio:"31/12/2002") 3.-sono di altro tipo( del tipo "0,0,0,0,0,0,0,0,0,0,0" oppure di quell'altro:"SYSTEM=115791,2316,4545,3,5553,742,7827,853,583,682,878" [list] Tanto per intenderci e' del tipo (il file,naturalmente): Stringa1,Stringa2,9,31/12/2002,2001,325,01111111111111111111111111111111 ,0,0,0,0,0,0,0,0,0,0,0 [b]Stringa3,Stringa4,9,31/12/2002,2001,326,01111111111111111111111111111111, oppure: [b] Stringa5,Stringa6,0,1/1/2005,2003,359,11110000000000000, SYSTEM=115791,2316,4545,3,5553,742,7827,853,583,682,878 [b] Stringa7,Stringa8,0,1/5/2005,1997,8,11111010011101001, SYSTEM=77407,4232,9681,3718,2077,591,1530,3326,7667,1678,5649 La parte in rosso e grassetto comprende i primi due tipi di stringe;la parte in nero contiene il tipo variabile...... [b][i]ciascuna delle sottostringhe deve essere infilato in una posizione di array sono, ciascuna,una stinga sola e vanno considerate tali anche quando bisogna infilarle nell'array...... Ricapitoliamo: [list] ci sono delle stringhe[i]delimitate da virgole..... quando si incontrano delle date,esse vanno considerate una stringa sola..... Ancora stringhe delimitate da virgole, Infine, il tipo variabile.....che per fortuna e' l'8°,l'ultimo....che va tenuto tutto insieme nell'ultima posizione dell'array trattandolo come una stringa sola.....(0,0,0,0,0,0,0,0,0,0,0) [list] In particolare: come faccio a capire che i due ultimi tipi di stringe,(non contenenti virgole o altri delimitatori) sono gli ultimi e che dopo l'ultimo pezzo non c'e' nulla? Come faccio separare ciascuna delle righe del file e a infilarle in una posizione ad hoc dell'array? L'array risultante sarebbe una matrice in cui ciascuna delle righe e' una riga del file e ciascuna delle colonne e' una sottostringa.... Come faccio a trattare indipendentemente ciascuna degli elementi della matrice: ([b]m(i,j) e' indipendente e usabile indipendentemente da m(l,p))? [list] m(i,j) & m(l,p) sono gli elementi della tabella risultante dall'assemblaggio come detto delle sottostringhe e l'espressione [i]Stringa[b]n summenzionata e' stata usata per motivi di privacy,il rosso e il grassetto per i tipi di sottostringa quasi normali Io,da parte mia,non sto capendo + nulla (si dovrebbe capire dalle ripetizioni e dall'esposizione contorta).....Spero che mi aiutiate..... [list] Grazie mille..... -------------------- Non ti arrabbiare....Tanto il mondo,un giorno,fara' a meno di te......
(Letto su un cartello in un negozio) |
|
|
|
|
|
|
|
2 Jul 2004, 09:21
Messaggio
#2
|
|
|
Andiamo per gradi
Iniziamo a dividere il file una riga alla volta. la funzione file(nome_file) restituisce un array con una riga in ciascun elemento. Quindi per cominciare: CODICE $linee = file("nomedelfile.txt");
Ciascuna riga avrà attaccato ancora il n (newline) alla fine quindi devi ricordarti di eliminarlo con rtrim(). A questo punto dovresti dirmi se: 1. la sequenza di zero è sempre identica ovvero è sempre 0,0,0,0,0,0,0,0,0,0,0 oppure il numero di 0 può variare. Se è identica procedi a cercare la successione di zeri in ciascun elemento dell'array, se è presente la estrapoli dalla stringa e la inserisci nel tuo array. A quel punto procedi a separare gli altri elementi con CODICE $elementi = explode(",", $linee[$numerolinea]);
In questo modo avrai un array formato da ciascun elemento diviso da virgola. Se la sequenza di zeri è variabile dobbiamo procedere con una regex. Oppure, conosci il numero minimo di zeri consecutivi? 2. Per il parametro SYSTEM puoi procedere sia con una regex che nel modo seguente. Cerchi se è presente la stringa SYSTEM=, se la trovi estrapoli tutto fino alla fine della stringa. CODICE $posizione = strpos($linee[$numerolinea], "SYSTEM=");
if($posizione !== false) $stringa = substr($linee[$numerostringa], $posizione); A quel punto procedi con l'explode come prima. Se ti serve qualche indicazione più precisa fai un fischio, spero di averti dato qualche dritta per iniziare. |
|
|
|
|
2 Jul 2004, 17:36
Messaggio
#3
|
|
|
CITAZIONE(Cubiq) Andiamo per gradi
Iniziamo a dividere il file una riga alla volta. la funzione file(nome_file) restituisce un array con una riga in ciascun elemento. Quindi per cominciare: CODICE $linee = file("nomedelfile.txt");
Ciascuna riga avrà attaccato ancora il n (newline) alla fine quindi devi ricordarti di eliminarlo con rtrim() ......omissis....... Grazie....mi stai tirando fuori da un grosso pasticcio..... Ok....fino a qui ci sono arrivato... Cominciamo con il livello [i]"catacombe"..... anche perche' il caldo ha curiosi effetti (su di me).... Ho provato a stampare $linee per vedere cosa succedeva..... non succede nulla...o meglio...scrive [i]Array.... Lo so che e' un array....Io volevo sapere cosa c'e' li' dentro.... In altri temini,non riesco a separare le linee...anche perche' non so quante sono....Per usare il numero di linee devo conoscerlo.....o devo conoscere il suo limite superiore che non riesco a calcolare Che devo fare? Una volta che riusciro' a conoscere la quantita' di linee (non solo per stamparle ,ovviamente) passero' a qualcos'altro.... Grazie mille..... -------------------- Non ti arrabbiare....Tanto il mondo,un giorno,fara' a meno di te......
(Letto su un cartello in un negozio) |
|
|
|
|
2 Jul 2004, 18:29
Messaggio
#4
|
|
|
Per sapere il numero di linee puoi usare sizeof() (oppure count() ).
CODICE $numerolinee = sizeof($nomearray);
ma se non ti serve il numero di linee, ma solo creare un ciclo che le esamini tutte allora meglio qualcosa del tipo: CODICE foreach($nomearray as $valore) {
... } la variabile $valore è una stringa che contiene il valore dei vari membri dell'array. Il ciclo foreach attraversa tutto l'array dal primo all'ultimo elemento. |
|
|
|
|
2 Jul 2004, 18:52
Messaggio
#5
|
|
|
CITAZIONE(Cubiq) Per sapere il numero di linee puoi usare sizeof() (oppure count() ).
CODICE $numerolinee = sizeof($nomearray);
ma se non ti serve il numero di linee, ma solo creare un ciclo che le esamini tutte allora meglio qualcosa del tipo: CODICE foreach($nomearray as $valore) {
... } la variabile $valore è una stringa che contiene il valore dei vari membri dell'array. Il ciclo foreach attraversa tutto l'array dal primo all'ultimo elemento. Dunque: Ho provato anche sizeof(.....) prima di scrivere la prima lettera....Mi da' 1...Insensato...perche' le linee sono[u]molte piu' di una.....e sizeof(....) non funziona. Io vorrei trovare qualcosa che mi dica :[i]in quel file ci sono m linee( =stringhe),se voglio,la riga (la posizione dell'array). Per essere ancora piu' chiaro,se e il caso,Io possiedo la stringa letta dal file (=il testo),so che e' fatto da x stringhe (=linee) ma non ho la + vaga idea di quanto valga x e non so determinarlo..... In qualunque maniera cerchi di visionarlo, la lunghezza dell'array e' [b]1 (invece che il numero di righe reale). Non riesco a scomporre l'array.....Uffa....e non riesco neppure a cosruirlo.... -------------------- Non ti arrabbiare....Tanto il mondo,un giorno,fara' a meno di te......
(Letto su un cartello in un negozio) |
|
|
|
|
3 Jul 2004, 07:58
Messaggio
#6
|
|
|
la funzione file() mette in un array ciascuna riga di un file. Se sizeof() restituisce 1, significa che per file() non riesce ad individuare le righe.
Il codice è il seguente: CODICE $linee = file("nomefile");
$numerolinee=sizeof($linee); Se ti restituisce 1, o le linee sono divise da qualche marcatore "strano" o il file non ha linee puoi provare a vedere cosa ti restituisce se fai CODICE echo $linee[0];
Infine, se mi vuoi spedire il file (almeno che non sia 10mega) magari provo a dargli un occhio. cubiq [at] cubiq [dot] org |
|
|
|
|
3 Jul 2004, 09:00
Messaggio
#7
|
|
|
CITAZIONE(Cubiq) la funzione file() mette in un array ciascuna riga di un file. Se sizeof() restituisce 1, significa che per file() non riesce ad individuare le righe.
Il codice è il seguente: CODICE $linee = file("nomefile");
$numerolinee=sizeof($linee); Se ti restituisce 1, o le linee sono divise da qualche marcatore "strano" o il file non ha linee puoi provare a vedere cosa ti restituisce se fai CODICE echo $linee[0];
Infine, se mi vuoi spedire il file (almeno che non sia 10mega) magari provo a dargli un occhio. cubiq [at] cubiq [dot] org A quest'ora dovresti avere ricevuto il file di testo..... La mail ti arriva da biosimulant [at] tiscali [dot] it e' l'indirizzo che uso in questi casi..... ho provato: CODICE echo $linee[0]; :
mi stampa de facto tutta la stringa e quindi tutto il testo del file...... ....Adesso che ci penso......il comittente mi ha accennato a qualcosa relativo a excel.....del tipo che il file di testo e' stato tratto da un foglio di excel....Subito non ci ho fatto caso (b....rdo) e/o non me ne sono piu' ricordato.....E' possibile?.... Grazie infinite...... Se riesci a fare qualcosa mi togli da un grosso casino..... (Si puo' dire,vero?) -------------------- Non ti arrabbiare....Tanto il mondo,un giorno,fara' a meno di te......
(Letto su un cartello in un negozio) |
|
|
|
|
3 Jul 2004, 11:01
Messaggio
#8
|
|
|
Il problema è che excel probabilmente crea un file con linee delimitate da un carattere non standard.
Di seguito ti incollo un codice fatto al volo, tutto da ottimizzare, ma funziona. CODICE <?
$file = file_get_contents("Code.txt"); // Esplode il file in linee $linee = explode("r", $file); // Inizializza l'array che conterrà tutti i campi $campi = array(); foreach($linee as $valore) { // Se la linea finisce con la sequenza di zeri if( $pos = strpos($valore, ",0,0,0,0,0,0,0,0,0,0,0") ) { // Sistema la linea in modo che sia semplice da inserire in un array $valore = substr($valore, 0, $pos); $valore = str_replace(",", "|", $valore); $valore.= "|0,0,0,0,0,0,0,0,0,0,0"; $campi[] = explode("|", $valore); } // Se la linea finisce con SYSTEM=.... elseif( $pos = strpos($valore, "SYSTEM=") ) { // Sistema la linea in modo che sia semplice da inserire in un array $tmp = substr($valore, $pos); $valore = substr($valore, 0, $pos); $valore = str_replace(",", "|", $valore); $valore.= $tmp; $campi[] = explode("|", $valore); } } echo "Numero di linee: ".count($campi)."<br /> Numero di campi per linea: ".count($campi[0]); ?> Per accedere ai valori basta che chiami ad esempio $campi[0][7] per leggere l'ottavo valore della prima linea. Gli array li puoi ovviamente organizzare come meglio credi. Spero di averti messo sulla strada. nota: il codice presuppone che vi sia sempre una successione si 11 zeri. Se così non fosse è necessario fare qualche modifica. nota2: il codice presuppone che SYSTEM=... sia sempre l'ultimo campo della linea. |
|
|
|
|
5 Jul 2004, 13:09
Messaggio
#9
|
|
|
Anche se penso che oramai il problema sia risolto... dico la mia:
il file mi sembra che sia uno standard CSV dove l'unico campo problematico e' l'8o. Si potrebbe trattarlo con il terminale cut e awk per sostituire le virgole che rompono in fondo con ; (SYSTEM=2;3;234...) e poi importarlo con MySQL. Il trattamento dei dati diventa quindi banel. Il tutto sarebbe moooooooolto piu' veloce che con gli strumenti di manipolazione dei file e degli array di PHP. Sperando di aver dato qualche dritta... Ciao, Roberto |
|
|
|
|
7 Aug 2004, 15:45
Messaggio
#10
|
|
|
Ciao,
perché non usare le espressioni regolari? Ecco un esempio: CODICE <?php
$linea1 = "Stringa5,Stringa6,0,1/1/2005,2003,359,11110000000000000,SYSTEM=115791,2316,4545,3,5553,742,7827,853,583, 682,878"; $linea2 = "Stringa1,Stringa2,9,31/12/2002,2001,325,01111111111111111111111111111111,0,0,0,0,0,0,0,0,0,0,0"; $regexp = "/^([^,]+),s?([^,]+),s?(d+),s?(d{1,2}/d{1,2}/d{4}),s?(d+),s?(d+),s?(d+),s?(.+)$/i"; preg_match($regexp, $stringa1, $matches[0]); preg_match($regexp, $stringa2, $matches[1]); print_r($matches); ?> ed ecco il risultato in console: CODICE Array
( [0] => Array ( [0] => Stringa5,Stringa6,0,1/1/2005,2003,359,11110000000000000,SYSTEM=115791,2316,4545,3,5553,742,7827,853,583, 682,878 [1] => Stringa5 [2] => Stringa6 [3] => 0 [4] => 1/1/2005 [5] => 2003 [6] => 359 [7] => 11110000000000000 [8] => SYSTEM=115791,2316,4545,3,5553,742,7827,853,583,682,878 ) [1] => Array ( [0] => Stringa1,Stringa2,9,31/12/2002,2001,325,01111111111111111111111111111111,0,0,0,0,0,0,0,0,0,0,0 [1] => Stringa1 [2] => Stringa2 [3] => 9 [4] => 31/12/2002 [5] => 2001 [6] => 325 [7] => 01111111111111111111111111111111 [8] => 0,0,0,0,0,0,0,0,0,0,0 ) ) Per esaminare tutto il file basta fare così: CODICE <?php
$file = file(__file__); $regexp = "/^([^,]+),s?([^,]+),s?(d+),s?(d{1,2}/d{1,2}/d{4}),s?(d+),s?(d+),s?(d+),s?(.+)$/i"; $count = 0; $matches = array(); foreach ($file as $linea){ preg_match($regexp, trim($linea), $matches[$count]); $count++ } ?> Il numero di linee è in $count e i risultati sono in $matches[$linea][$campo]. Il campo deve cominciare da 1 perché nella posizione 0 preg_match() ci mette tutta la riga. Ciao. -- Gianni |
|
|
|
|
![]() ![]() |
| Titolo discussione | Risposte | Autore discussione | Visite | Ultima azione | |||
|---|---|---|---|---|---|---|---|
![]() |
26 | sem® | 1.974 | Ieri, 10:58 Ultimo messaggio di: cenomans |
|||
![]() |
4 | sirguich_ | 49 | 4 September 2008 - 18:43 Ultimo messaggio di: sirguich_ |
|||
![]() |
14 | preglia | 158 | 4 September 2008 - 17:26 Ultimo messaggio di: sirguich_ |
|||
![]() |
33 | sem® | 3.205 | 3 September 2008 - 19:08 Ultimo messaggio di: Martini |
|||
![]() |
0 | borros | 76 | 2 September 2008 - 11:36 Ultimo messaggio di: borros |
|||
![]() |
10 | alcina | 149 | 2 September 2008 - 10:25 Ultimo messaggio di: alcina |
|||
![]() |
3 | genilli | 91 | 1 September 2008 - 23:32 Ultimo messaggio di: sirguich_ |
|||
![]() |
8 | ugo | 324 | 29 August 2008 - 22:01 Ultimo messaggio di: ugo |
|||
![]() |
3 | Geyser | 71 | 29 August 2008 - 13:38 Ultimo messaggio di: Martini |
|||
![]() |
3 | bacillino80 | 101 | 29 August 2008 - 11:37 Ultimo messaggio di: bacillino80 |
|||
![]() |
3 | pepo154 | 113 | 25 August 2008 - 21:57 Ultimo messaggio di: saurospagnol |
|||
![]() |
1 | sirguich_ | 51 | 24 August 2008 - 23:26 Ultimo messaggio di: alcina |
|||
|
Versione Lo-Fi | Oggi è il: 6 September 2008 - 00:55 |
| IP.Board Skin Developed By Creative Networks | ||