Visualizzazione risultati 1 fino 16 di 16

Discussione: Flusso dati txt

  1. #1
    Guest

    Post Flusso dati txt

    Salve a tutti, ringrazio anticipatamente tutti coloro che risponderanno. Il mio problema è il seguente:

    ho un file txt contenente un flusso di dati con dei limitatori di inizio riga.

    Codice:
    111MARCO  2016-03-04                                                                                                                                                                                                                                                                                                                                         
    4842016-03-04DESCRIZIONE1                     VALORE1    10578                                                                                                                                                                                                           
    999MARCO  2016-03-04H000000003                                                                                                                                                                                                                                                                                                                                
    
    111GIOVANNI  2016-03-04                                                                                                                                                                                                                                                                                                                                         
    4842016-03-04DESCRIZIONE1                     VALORE1    02045                                                                                                                                                                                                           
    4642016-03-04DESCRIZIONE2                     VALORE2    02045                                                                                                                                                                                                           
    999GIOVANNI  2016-03-04P000000001
    111 ad inizio riga è l'intestazione
    484 e 464 indicano delle descrizioni e dei valori
    999 è la chiusura

    Da questo flusso devo tirare fuori logicamente delle variabili sia dall'intestazione che dal corpo e dalla chiusura, ad esempio MARCO che è il nome, 2016-03-04 che è la data ecc, e inserirle in un riga di una tabella mysql.

    Il file è a lunghezza variabile e ogni gruppo non è detto che contenga anche la descrizione, potrebbe avere solamente la riga 111 e quella 999, come potrebbe contenere svariati 484,464 ecc.

    I delimitatori 111 e 999 che potrei utilizzare come inizio e fine di ogni riga, non è detto che siano univoci.

    Qualche idea su come tirare fuori le variabili?

  2. #2
    Guest

    Predefinito

    Secondo me devi explodere il file dentro un array

    http://www.homeandlearn.co.uk/php/php10p7.html

    Però ti serve un delimitatore, dovresti gestirti prima il .txt e costruirtelo ad hoc poi fai il fopen ed il ciclo con l'explode altrimenti così a spazi diventa un pò laborioso se non quasi impossibile, altrimenti potresti convertire il text in csv e poi gestirlo come csv....C'è un pò di lavoro da fare.

  3. #3
    Guest

    Predefinito

    Citazione Originalmente inviato da fractalcosmo Visualizza messaggio
    Secondo me devi explodere il file dentro un array

    http://www.homeandlearn.co.uk/php/php10p7.html

    Però ti serve un delimitatore, dovresti gestirti prima il .txt e costruirtelo ad hoc poi fai il fopen ed il ciclo con l'explode altrimenti così a spazi diventa un pò laborioso se non quasi impossibile, altrimenti potresti convertire il text in csv e poi gestirlo come csv....C'è un pò di lavoro da fare.
    Purtroppo sulla generazione del file non posso intervenire, è un flusso che devo elaborare così com'è...

  4. #4
    Guest

    Predefinito

    Ehh allora puoi intervenire nella gestione successiva, ovviamente però questo file .txt deve avere delle regole generali, però tu puoi convertire il text in formato csv comma separeted values e qui hai un formato con dei separatori, un csv non è altro che un text alla fine, poi con PHP cicli il csv ed hai il recupero di tutte le variabili e poi creerai le tue leggi per la gestione delle variabili, ci sono vari modi o programmi free per convertire un text in csv, puoi anche farti uno script in php, una ricerca veloce ho trovato questo script, poi ovviamente lo adatti alle tue esigenze, se non puoi intervenire su come viene generato il text devi convertirlo in comma separated value e poi recuperi le variabili.

    http://stackoverflow.com/questions/1...-csv-using-php

    Convertitore online:

    https://convertio.co/it/txt-csv/

    Allora il punto è questo ho rivisto il tuo text, intanto si scontra subito un problema, ahahahah non ci sono gli spazi tra 111 ed il nome il convertitore di solito prende gli spazi tra una parola e l'altra e gli inserisce un comma di solito una virgola, tu dovrai fare altri tipi di controlli perchè se la stringa contiene 111 diventa la tua stringa di partenza e poi devi forzare uno spazio dopo 111 lo stesso per 999, da quello che ho capito questi numeri sono comunque codici che saranno sempre quelli, quindi puoi tranquillamente intervenire al suo interno ci sarà sempre 111 come inizio e 999 come fine poi nel mezzo ci saranno i vari codici 484 e dopo la data oppure 464 etc....ehh certo devi gestire tutti i casi...Infatti i programmatori si fanno pagare :)
    Ciao

    Ps:I delimitatori 111 e 999 che potrei utilizzare come inizio e fine di ogni riga, non è detto che siano univoci.

    Ehh però se non sono univoci e non so potrebbero essere 222 e 888 devi comunque sapere che 222 è un inizio riga e 888 una fine e farai degli if se la stringa contiene 111 allora necessariamente ci sarà un 999 come finale se contiene 111 allora necessariamente DOPO 111 ci sarà la data e dopo la data il nome....Cioè una logica generale ci deve essere altrimenti se non c'è logica devi dire a chi fa il file text di studiare un pò di logica...Ahahaha scherzo, fammi sapere.
    Ultima modifica di fractalcosmo : 07-03-2016 alle ore 20.04.38

  5. #5
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Chi ti fornisce il file ha (dovrebbe avere) anche il compito di fornirti un modo per leggerlo e manipolarne i contenuti, o almeno le specifiche sul formato, quindi dovresti chiedere al "produttore".

    Ma, siccome al mondo non c'è giustizia, è probabile che il "produttore" non ti offrirà il supporto che ti è dovuto, e dovrai scriverti da solo analizzatore lessicale e sintattico. Impresa tutt'altro che impossibile, ma piuttosto impegnativa, che comincia in ogni caso con una definizione formale della grammatica (leggasi "struttura") del contenuto del file, ad esempio in forma normale di Backus.
    Nel migliore dei casi la grammatica sarà regolare e potrai usare espressioni regolari per "esplodere" il contenuto del file.

    L'alternativa è provare a scrivere/usare un convertitore a naso e andando un po' per tentativi finché non ottieni un qualcosa che più o meno funziona, soluzione decisamente più sporca e rapida.
    Ultima modifica di mzanella : 07-03-2016 alle ore 20.09.28

  6. #6
    Guest

    Predefinito

    Ehh ma con le espressioni regolari Zanella diventa un bordello, sai quante ce ne sono ?
    Conviene di più che si recupera in maniera ricorsiva tutte le variabili e poi le gestisce cioè, il file diventerebbe così:

    111MARCO,2016-03-04,4842016-03-04DESCRIZIONE1,VALORE1,10578,
    999MARCO,2016-03-04H000000003,
    111GIOVANNI,2016-03-04,4842016-03-04DESCRIZIONE1,VALORE1,02045,
    4642016-03-04DESCRIZIONE2,VALORE2,02045,
    999GIOVANNI,2016-03-04P000000001

    Lo esplode e recupera tutte le variabili poi gestirei se la stringa contiene 111 ed la lungheza è maggiore di 3 allora vuol dire che dopo ci sarà un nome che si presuppone non abbia numaeri il nome :)
    Quindi mi recupero il nome poi se la stringa è finita bene passo a quella successiva altrimenti ci sarà la data fino a quando non trovo la virgola...Ovviamente però il codice 111NOMEDATADESCRIZIONE deve essere così perchè se può anche essere

    111DATADESCRIZIONENOME ehhh allora non si può fare..... :)

    Ad esempio questi due P000000001 e h000000003 sembra che abbiano sempre lunghezza 10...Cioè si è un bordello c'è da mettersi lì e crearsi tutte le regole...PERO' UNA LOGICA MINIMA CI VUOLE, altrimenti non si può fare, non possiamo mica diventare mago merlino.... Ahahahahah
    Ultima modifica di fractalcosmo : 07-03-2016 alle ore 20.27.02

  7. #7
    Guest

    Predefinito

    Si ma non è così semplice perchè una volta che hai trovato la linea 111 che non è detto che sia sempre quella e dentro questa linea devi estrarre la descrizione, il nome e la data quindi devi prendere la stringa e fare ancora altre regex e poi devi capire quando finisce la stringa della descrizione quando inizia il nome e quando inizia la data e poi devi ricavare il valore.Se la stringa del nome-data-descrizione è unica senza spazi devi intervenire all'interno comunque.

    Non penso che lui debba solo estrarre la stringa dopo l'111, lui deve dividere tutto il contenuto...Non è così immediato, la soluzione migliore, a livello PROFESSIONALE è dividersi le variabili, convertire in un CSV come viene usato nella maggior parte dei casi e recuperare tutte le variabili, deve solo farsi inserire uno spazio tra una variabile e l'altra, se non gli inseriscono lo spazio comunque dovrebbe gestire con i regex tutto lo stringone quindi farebbe lavoro doppio e deve sempre sperare che la data sia sempre nello stesso formato mentre una volta che hai la stringa basta che sia lunga 10 controlli con php la lunghezza per esempio, in più devi gestire quando 111 è la stringa di partenza e quando invece potrebbe essere 222, convertire in variabili già esplose è molto più comodo e leggibile, almeno noi quando dobbiamo gestire grandi quantitativi di dati usiamo i CSV, pHp a convertire un test in csv ci mette 2 millisecondi e a leggerlo 4 :)
    Ovviamente questa è la mia opinione....
    Ciau

    http://php.net/manual/en/function.fgetcsv.php
    Ultima modifica di fractalcosmo : 09-03-2016 alle ore 13.53.59 Motivo: inserito link parse CSV

  8. #8
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Sembra che il mio inciso sulle espressioni regolari abbia suscitato un'attenzione ben più alta di quanto meritasse.
    A scanso di equivoci, ciò che intendevo dire è: SE la grammatica soggiacente è regolare, allora un'espressione regolare può permettere di effettuare il parsing in maniera ben più efficiente e compatta di quanto un parser ricorsivo sia in grado di fare.

    Purtroppo riguardando gli esempi sembra che il linguaggio descritto non sia regolare, dunque che mancano le premesse per seguire questa strategia.

    Assumendo che la grammatica sia libera da contesto, uno strumento da usare è il parser ricorsivo. La conversione in CSV non è necessaria, ma nulla vieta di servirsene se è in grado di semplificare l'analisi lessicale.

    Fermo restando che senza una specifica formale della struttura del linguaggio, queste restano speculazioni .

  9. #9
    Guest

    Predefinito

    Ciao Zanella,
    permettimi di essere in disaccordo, io sono abbastanza umile come persona, però sinceramente sono anche uno che porta avanti dei progetti molto ampi e sinceramente mi da fastidio fare i garini ma è anche vero che non sono il primo venuto, e delle volte sembra che tutti si alzino a professori e non so come prenderla, sinceramente è la prima volta che sento che PARSARE UN FILE CON INFINITI RECORD DA .TXT È COMODO FARLO CON ESPRESSIONI REGOLARI....Non ho mai sentito una cosa del genere nè tantomeno vista all'opera a livello professionale.
    Noi gestiamo grossi quantità di dati per esempio che ci arrivano ad esempio in excel, vengono trasferiti in CSV e pensa che gestiamo inner join e ricreiamo tabulati, prendiamo gestiamo manipoliamo e ricostruiamo, certo l'excel è comunque ordinato ma la comodità del CSV è che divide comunque le stringhe con dei limitatori, non ho mai sentito di parsare un intero file con delle espressioni regolari, nè tantomeno in questo caso si potrebbe parsare il text, non è conveniente, tanto meno un txt parsarlo con espressioni regolari, la soluzione più gestibile e professionale è sicuramente RENDERE STRUTTURATO IL FILE, quindi dividerlo in variabili e gestirlo in array.Anche perchè che un'espressione regolare sia più efficiente delle funzioni parse stesse del PHP mi è proprio nuova...Forse non si ha così tanta fiducia nel PHP.

    Non ho mai sentito di parsare un file intero con espressioni regolari e calcola che io parso CSV, XML e tutte le directory.Calcolando che la positività del CSV è proprio che il file viene diviso secondo determinate regole.
    Mahh poi ognuno lavora come vuole ma non dire che è comodo ed è la soluzione migliore perchè scusami ma non è vero, poi sono umile è dico anche di non programmare da 50 anni, per fortuna non sono vecchio, ma è anche vero che sono bravo a programmare diamo a Cesare quel che è di Cesare.... :) E mi piace molto programmare.
    Ciao
    Ultima modifica di fractalcosmo : 09-03-2016 alle ore 15.55.39

  10. #10
    rdspc non è connesso Neofita
    Data registrazione
    17-10-2014
    Messaggi
    2

    Predefinito

    Salvando in un file "nomi.txt" il testo postato all' inizio del thead...lo script ne ricava le parti salienti usando le espressioni regolari... va poi ulteriormente raffinato.

    Codice PHP:
    <?php
    // http://localhost/MET/nomi.php
    $testo=file_get_contents ( "nomi.txt");
    preg_match_all("/111(.*?)999/s", $testo, $result );

    foreach (
    $result[0] as $linea) {
    echo
    $linea."<br><br>";

    if (
    strpos($linea,"484")){
    preg_match_all("/484(.*?)\n/s", $linea, $param );
    echo
    $param[0][0]."<br>";
    }

    if (
    strpos($linea,"464")){
    preg_match_all("/464(.*?)\n/s", $linea, $param );
    echo
    $param[0][0]."<br>";
    }
    echo
    "<br>";
    }
    ?>

  11. #11
    Guest

    Predefinito

    Ciao RDSPC,
    Quello che hai scritto però non vedi che ti sei perso dei dati per strada?Senza polemizzare ovviamente, il risultato del tuo script è questo;

    111MARCO 2016-03-04 4842016-03-04DESCRIZIONE1 VALORE1 10578 999

    4842016-03-04DESCRIZIONE1 VALORE1 10578

    111GIOVANNI 2016-03-04 4842016-03-04DESCRIZIONE1 VALORE1 02045 4642016-03-04DESCRIZIONE2 VALORE2 02045 999

    4842016-03-04DESCRIZIONE1 VALORE1 02045
    4642016-03-04DESCRIZIONE2 VALORE2 02045

    Mentre il testp originale è questo:
    111MARCO 2016-03-04
    4842016-03-04DESCRIZIONE1 VALORE1 10578
    999MARCO 2016-03-04H000000003
    111GIOVANNI 2016-03-04
    4842016-03-04DESCRIZIONE1 VALORE1 02045
    4642016-03-04DESCRIZIONE2 VALORE2 02045
    999GIOVANNI 2016-03-04P00000000

    Mancano i valori finali P00000000 e h00000003, comunque ribadisco ognuno poi fa come vuole, certo è che se devo arrivare a Roma da Milano è prendo Italo è un conto se prende una macchina e poi la bicicletta e poi il motorino e poi l'autobus e poi mi faccio un pezzo a piedi è un'altra questione, ovviamente ognuno ci arriva come vuole l'importante è arrivarci SANI E SALVI...Ciao

    Ps:È la prima volta che sento dire che è meglio parsare con 50 mila regex che usare le funzioni parse-innate di PHP, c'è sempre una prima volta a tutto... :)
    Ultima modifica di fractalcosmo : 09-03-2016 alle ore 16.59.54

  12. #12
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Nemmeno io ho mai sentito nessuno dire che "parsare un file con infiniti record da .txt è comodo farlo con espressioni regolari", e di certo non sono stato io a dirlo .

    Al massimo ho suggerito che, se il contenuto del file fosse un'espressione regolare, si potrebbe effettuare il parsing con... un'espressione regolare.
    Però sembra piuttosto un linguaggio libero da contesto (come XML, HTML e molti altri), quindi... parser ricorsivo. Che poi questo venga implementato a mano, sfruttando una conversione a CSV, o in altro modo, ben venga!

    Riguardo all'utilizzo in scenari reali, c'è una pagina sul sito del MIT di Boston in cui se ne accenna l'uso per i file in formato markdown. Viene anche menzionato che non funziona per formati come HTML, in quanto non regolari.

  13. #13
    Guest

    Predefinito

    Alla fine noi sempre con le nostre discussioni di programmazione, però Zanella scusa ma non vedo l'attineza con un linguaggio di markdown che nasce anche per poter essere convertito in HTML con un file text di variabili come nel nostro caso, un linguaggio di markdown presuppone comunque una conversione, nasce per quell'intento, quindi non è altro che un file text rigenerato per poter essere riconvertito in soldoni, e siamo sempre in gestione client cosa molto diversa da un approccio completamente opposto.
    Comunque se vedi il file la logica c'è abbiamo tre numeri che identificano partenza tipi di descrizioni e valori e poi altri tre numeri di chiusura, una data a 10 caratteri numeri e trattini, un codice valore finale a 5 numeri un id di chiusura alfanumerico a 10 caratteri...Dopo i tre numeri che rappresentano apertura e chiusura ricorsivamente di ha nome e data...Non serve complicarsi la vita per rischiare di ottenere un risultato che non sia sempre valido tra l'altro.
    Comunque ad ognuno la sua scelta...

  14. #14
    rdspc non è connesso Neofita
    Data registrazione
    17-10-2014
    Messaggi
    2

    Predefinito

    Citazione Originalmente inviato da fractalcosmo Visualizza messaggio
    Ciao RDSPC,
    Quello che hai scritto però non vedi che ti sei perso dei dati per strada?Senza polemizzare ovviamente
    Ho semplicemente indicato un metodo all' utente jacoponeroni per ricavare da un file di testo non strutturato, ma che comunque ha una logica, delle informazioni che vanno processate.

    L' output dello script e' puramente didattico per far capire come ricavare quelle informazioni usando le espressioni regolari.
    Se Jacoponeroni ha richiesto un metodo per parsare quel tipo di file ,probabilmente e' perche' chi glielo fornisce non ha intenzione o non puo' intervenire sul programma che lo genera.

    Certo il mondo sarebbe migliore se tutti lavorassero con file strutturati... CSV o meglio ancora JSON ,ma la relta' a volte e' matrigna.

    Non mi sembra cmq che Jacoponeroni abbia indicato come priorita' la velocita' di esecuzione, quindi se lo script ci mettera' 2 minuti anziche' 2 millisecondi non credo che per lui sia un problema.

  15. #15
    Guest

    Predefinito

    A lui serve tirare fuori le variabili una ad una, infatti la comodità la trova il programmatore, se a me il cliente mi da un file e mi dice mettimelo in tabella cerco la via più comoda per farlo, lui infatti ha il formato text basta che lo converte in CSV con uno script PHP(inserito in una funzione ad hoc riutilizzabile)e poi, come quando recuperi una select da sql dentro il ciclo lui può già mettere in tabella rimane solo da gestire se le variabili sono attaccate cioè non c'è uno spazio, perchè il CSV delimita gli spazi, apparte che quando converte potrebbe già crearsi le regole per forzare gli spazi in determinati punti obbligatori, male che va se non vuole farlo prima lo fa dopo dentro il ciclo una volta che è tutto in CSV.
    Ma per esempio una volta che hai già

    $primaVariabile = 999MARCO;
    $secondaVariabile = 2016-03-04H000000003

    Per esempio perchè il CSV ti ha già messo in array le stringhe, capisci che gestirlo è più comodo?Ciao

  16. #16
    Guest

    Predefinito

    Comunque dato che secondo me non ha molto senso parlare senza lavorare, ti ho fatto un piccolo esempio alla veloce ho preso un paio di script dal manuale di PHP ed uno script dal web per la tabella, una cosa molto veloce, quindi ovviamente ci devi studiare e te la devi gestire, la tabella devi intestarla nella th mette la prima riga devi mettere tu dei campi titolo, ma proprio una cosa veloce, ho creato un file testo.txt con i tuoi valori, ed un file testo.csv VUOTO dove vado a salvare il CSV....
    Hai tutte le variabili ed anche tabellate con 20 minuti di lavoro :)
    Ovviamente la tabella la crea per qualsiasi formato del TXT appena trova lo spazio inserisce il campo.
    Ti metto il codice ed il link dove puoi dare un'occhiata, ovviamente è un debug e esempio di come ricavarsi tutte le variabili, devi solo gestirti il caso in cui la stringa non abbia lo spazio cioè ad esempio questa 999MARCO
    Ciao lo tengo online per un paio di giorni l'esempio poi lo tolgo..

    http://fractalcosmo.altervista.org/MvcWebLog/prove.php

    il codice

    Codice PHP:

    <?php

    //Legge il file di testo
    $pathfile = 'testo.txt';
    $fileObj = fopen( $pathfile, "rt" );

    $array=array();
    //Cicla il contenuto del file testo e rimpiazza gli spazi con le virgole, A DIRE IL VERO IL CSV VORREBBE I ;
    //SAREBBE MEGLIO METTERE I PUNTI E VIRGOLA ;
    while ( ( $line = fgets( $fileObj ) ) ) {

    $replaceSpazi = preg_replace('/\s+/', ',', $line); ;

    $array[]=$replaceSpazi;
    }

    //Apre il file CSV vuoto e ci spara dentro l'array di prima che non è altro che il .txt convertito in CSV
    $file = fopen("testo.csv","w");

    foreach (
    $array as $line){

    fputcsv($file,explode(',',$line));

    }

    fclose($file);

    //legge il file CSV e mette in un array i valori e fa il var_dump dell'array dei valori
    $csvData = file_get_contents('testo.csv');
    $lines = explode(PHP_EOL, $csvData);
    $array = array();

    foreach (
    $lines as $line) {

    $array[] = str_getcsv($line);
    }

    //Non serve a niente l'implode ma lo lascio per SICUREZZA...Ahahahah
    //$implode = implode(',', $lines);

    //Tutti i valori in un array
    print '<pre>';var_dump($array);print'<pre>';

    //Recupera i valori dall'array e li printa andando a capo ad ogni campo
    foreach ($array as $chiave){
    foreach (
    $chiave as $valoreDati){
    print
    $valoreDati .'<br>';
    }

    }

    //PARI PARI DAL WEB NON FA ALTRO CHE PRENDERE IL CODICE DAL MANUALE IMPLEMENTANDOCI LA TABELLAZIONE

    $row = 1;
    if ((
    $handle = fopen("testo.csv", "r")) !== FALSE) {

    echo
    '<table border="1">';

    while ((
    $data = fgetcsv($handle, ",")) !== FALSE) {

    $num = count($data);
    if (
    $row == 1) {
    echo
    '<thead><tr>';
    }else{
    echo
    '<tr>';
    }

    for (
    $c=0; $c < $num; $c++) {
    //echo $data[$c] . "<br />\n";
    if(empty($data[$c])) {
    $value = "&nbsp;";
    }else{
    $value = $data[$c];
    }
    if (
    $row == 1) {
    echo
    '<th>'.$value.'</th>';
    }else{
    echo
    '<td>'.$value.'</td>';
    }
    }

    if (
    $row == 1) {
    echo
    '</tr></thead><tbody>';
    }else{
    echo
    '</tr>';
    }
    $row++;
    }

    echo
    '</tbody></table>';
    fclose($handle);
    }

    //QUESTO E' PRESO PARI PARI DAL MANUALE LOL....
    $row = 1;
    if ((
    $handle = fopen("testo.csv", "r")) !== FALSE) {
    while ((
    $data = fgetcsv($handle, 1000, ",")) !== FALSE) {
    $num = count($data);
    echo
    "<p> $num Campi nella riga $row: <br /></p>\n";
    $row++;
    for (
    $c=0; $c < $num; $c++) {
    echo
    $data[$c] . "<br />\n";
    }
    }
    fclose($handle);
    }

    ?>
    Quando si dice la potenza del PHP... :) Ciao e buon lavoro...spero ti sia utile.

    PS:Come vedi devi adattarlo io ho solo messo alla veloce lo stile di lavoro ma ad esempio come campi conta anche gli spazi vuoti quindi lì andrà gestito ovviamente, ma se hai inizio e fine delle righe cioè 111 e 999 diventa comunque facilmente gestibile E A QUESTO PUNTO ANCHE CON DELLE REGEX VOLENDO ;)...basta personalizzarlo e analizzare il codice..Ciao
    Ultima modifica di fractalcosmo : 10-03-2016 alle ore 02.17.15

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •