Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2001
    Messaggi
    320

    estrarre records da files txt

    ciao
    mi rivolgo a questo forum perchè in passato sono sempre stato aiutato egregiamente.
    Il problema di oggi è che vorrei estrarre da files .txt dei records

    esempio di un file txt :

    genus: Auhunga
    species: Auhunga pectinata Forster & Wilton, 1973

    genus: Auximella
    species: Auximella harpagula (Simon, 1906)
    species: Auximella minensis (Mello-Leitao, 1926)
    species: Auximella producta (Chamberlin, 1916)
    species: Auximella spinosa (Mello-Leitao, 1926)
    species: Auximella subdifficilis (Mello-Leitao, 1920)
    species: Auximella typica Strand, 1908

    genus: Bakala
    species: Bakala episinoides Davies, 1990

    genus: Bifidocoelotes
    species: Bifidocoelotes bifidus (Wang, Tso & Wu, 2001)
    species: Bifidocoelotes primus (Fox, 1937)

    genus: Callevopsis
    species: Callevopsis striata Tullgren, 1902

    genus: Callobius
    species: Callobius angelus (Chamberlin & Ivie, 1947)
    species: Callobius arizonicus (Chamberlin & Ivie, 1947)
    species: Callobius bennetti (Blackwall, 1846)
    species: Callobius canada (Chamberlin & Ivie, 1947)
    species: Callobius claustrarius (Hahn, 1833)
    species: Callobius claustrarius balcanicus (Drensky, 1940)
    species: Callobius deces (Chamberlin & Ivie, 1947)
    species: Callobius enus (Chamberlin & Ivie, 1947)
    species: Callobius gertschi Leech, 1972
    species: Callobius guachama Leech, 1972
    species: Callobius hokkaido Leech, 1971
    species: Callobius hyonasus Leech, 1972
    species: Callobius kamelus (Chamberlin & Ivie, 1947)
    species: Callobius klamath Leech, 1972
    species: Callobius koreanus (Paik, 1966)
    species: Callobius manzanita Leech, 1972
    species: Callobius nevadensis (Simon, 1884)
    species: Callobius nomeus (Chamberlin, 1919)
    species: Callobius olympus (Chamberlin & Ivie, 1947)
    species: Callobius panther Leech, 1972
    species: Callobius paskenta Leech, 1972
    species: Callobius pauculus Leech, 1972
    species: Callobius paynei Leech, 1972
    species: Callobius pictus (Simon, 1884)
    species: Callobius rothi Leech, 1972
    species: Callobius severus (Simon, 1884)
    species: Callobius sierra Leech, 1972
    species: Callobius tamarus (Chamberlin & Ivie, 1947)
    species: Callobius tehama Leech, 1972

    genus: Cavernocymbium
    species: Cavernocymbium prentoglei Ubick, 2005
    species: Cavernocymbium vetteri Ubick, 2005

    genus: Chresiona
    species: Chresiona convexa Simon, 1903
    species: Chresiona invalida (Simon, 1898)
    species: Chresiona nigrosignata Simon, 1903


    una volta estratti i records ( solo quelli che iniziano con " species:.... "da tutti i files txt
    i records estratti dovrebbero essere messi in un unico file txt ma ordinati alfabeticamente.

    potrei farlo manualmente ma i records sono + di 40.000

    è possibile ?

    Ringrazio tutti anche se non ci saranno risposte

    Felicità e Prosperità a tutti

  2. #2
    Allora, potresti creare un array delle righe con la funzione file().

    in seguito con foreach lo scorri.

    Per ogni riga verifichi se inizia per species.

    Se inizia per species explodi sul : e inserisci il valore [1] in un nuovo array.

    Alla fine hai un array che puoi ordinare alfabeticamente con la funzione sort()

    A questo punto hai l'array ordinato alfabeticamente, non hai che da scrivere riga per riga nel nuovo file di testo forecciando l'array.

    Una sola perplessità. Ma con una così grande quantità di dati, non sarebbe meglio prendere in considerazione l'utilizzo di un database?
    PHP LEARN - Guide, tutorial e articoli sempre aggiornati
    NUOVO: standardLib; il potente framework PHP é ora disponibile
    *******************************************
    Scarica oggi la tua copia di MtxEventManager

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2001
    Messaggi
    320
    innanzi tutto grazie dei consigli

    ti spiego cosa è questa cosa

    tutti i records sono i nomi scentifici di tutti i ragni.

    ho già un data base d'immagini e voglio controllare quali sono le immagini che mi mancono, per far questo dato che i records sono divisi per famiglie e generi e a me serve solo la specie devo estrapolarli dai files .txt

    non so se mi sono spiegato, cmq avevo già fatto una cosa del genere ma nn sono arrivato a nulla di concreto, se tu potessi darmi ulteriori e più precise informazioni te ne sarei grato.

    specialmente come estrapolare e mettere in array i records.

    Ciao e grazie
    Felicità e Prosperità a tutti

  4. #4
    Infatti ... il numero di righe sembra un po' elevato

    Attenzione alla impostazione max_allowed_packet nel php.ini

    Magari se disponibile lanci con
    Codice PHP:
    passthru("sed -e '/genus:/d' /PATH/input.txt > /PATH/output.txt"); 
    in questo modo il file output.txt conterrà solo i record con species.
    Dopodiche segui le indicazioni di maurizio

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2001
    Messaggi
    320
    Grazie anche a te per l'attenzione che hai posto al mio problema

    domani proverò a combinare qualcosa

    Felicità e Prosperità a tutti

  6. #6
    Dunque, questo non ho potuto provarlo perchè non sono a casa. Ma dovrebbe di principio funzionare.

    La questione che si porrà, probabilmente, é che una mole così grande di dati potrebbe creare problemi di memoria, tempo massimo di esecuzione, ed altre cosette. Però magari funziona. Al limite si può suddividere il file di testo. Comunque prova.

    Codice PHP:
    <?php
    $file 
    file('elenco.txt');

    $SpeciesArray = array();

    foreach(
    $file as $row//scorro l'array
    {
        if(
    ereg('^(species)'$row)) //se la riga inizia per species
        
    {
            
    $SingleRow explode(':'$row);
            
    $SpeciesArray[] = trim($SingleRow[1]); //metto quello che c'è dopo il : nell'array
        
    }    
    }

    sort($SpeciesArray); // ordino alfabeticamente l'array

    $fp fopen('elenco2.txt''a+'); //creo il nuovo file di testo e la risorsa

    foreach($SpeciesArray as $FinalRow)
    {
        
    fwrite($fp$FinalRow "\r\n"); // scorro il nuovo array scrivendo riga per riga nel nuovo file di testo
    }

    fclose($fp);

    ?>
    Comunque, visto che si dovrà fare questa fatica, perché non importare il tutto in un più ordinato e comodo database. Una tabella per i generi, in relazione con quella delle specie, in relazione a sua volta con le immagini. Infinite possibilità di ricerca e di ordinamento, eccetera.

    PHP LEARN - Guide, tutorial e articoli sempre aggiornati
    NUOVO: standardLib; il potente framework PHP é ora disponibile
    *******************************************
    Scarica oggi la tua copia di MtxEventManager

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2001
    Messaggi
    320
    GRAZIE grazie

    io ho fatto così:
    <?php
    //carico i file .txt dalla directory
    $handle = opendir('Catalogo');

    while (false !== ($file = readdir($handle))) { //creo il ciclo per tutti i files txt del catalogo
    if ($file != "." && $file != "..")
    {
    $fcontents = file ($file); //leggo il contenuto del file
    $i=1;
    while (list ($line_num, $line) = each ($fcontents)) {
    $nom = substr($line, 0, 4);//cerco i primi 4 caratteri e li confronto
    if($nom == "spec"){ // seleziono solo le righe cge iniziano con spec( i primi 4 cratteri del record)
    $lista[$i] = $line; //creo un nuovo array con i valori ricercati
    $i++;
    }
    }//chiusura while list
    }//chiudo IF verifica estensione $file
    }//chiudo while ricerca nella dir

    closedir($handle);

    sort ($lista);
    reset ($lista);
    while (list ($chiave,$valore) = each ($lista)) { //ordino alfabeticamente i record dell'array
    echo $valore."
    \n"; //visualizzo i dati
    }
    //salvo il risultato in un unico file txt
    $file_salvare = join ("", $lista);

    $fileb = fopen("Ragni-lista-completa.txt", "wb");
    fwrite($fileb, $file_salvare);
    fclose($fileb);
    ?>

    Funziona bene anche se non molto ortodosso come il tuo.

    l'ho impostato ad illimitato il tempo d'esecuzione .

    .....ora però mi piacerebbe che dai records venisse eliminato il testo che nn m'interessa ad esempio da:
    species: Acanthoceto cinereus (Tullgren, 1901)
    species: Acanthoceto ladormida Ramírez, 1997

    vorrei che rimanesse:
    Acanthoceto cinereus
    Acanthoceto ladormida

    ho provato alcune cose ma con scarsi risultati
    dovrei trovare il modo di eliminare ciò che segue il secondo spazio, dopo aver eliminato la scritta specie: cosa molto semplice

    e grazie
    Felicità e Prosperità a tutti

  8. #8
    Uffa, non farti dire proprio tutto

    togli species: con ad esempio

    str_replace('species:', '', $string);

    togli quello che c'è tra parentesi (comprese) con un'espressioncina regolare tipo

    $string = preg_replace("'\(.*?\)'si", '', $string);

    fai un trim per sicurezza e il gioco è fatto
    PHP LEARN - Guide, tutorial e articoli sempre aggiornati
    NUOVO: standardLib; il potente framework PHP é ora disponibile
    *******************************************
    Scarica oggi la tua copia di MtxEventManager

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2001
    Messaggi
    320
    Maurizio scusami ma il problma è che nn tutto il testo che voglio eliminare è tra parentesi
    es:
    species: Acanthoceto cinereus (Tullgren, 1901)
    species: Acanthoceto ladormida Ramírez, 1997

    se noti nel secondo record ' Ramirez, 1997 ' nn è tra parentesi e dovrebbe essere eleminato

    una volta tolto la prima parte e 'species:' si dovrebbe poter creare un codice che elimini la parte restante partendo dal secondo spazio

    scusa abbi pazienza ma certe cose nn riesco a farle

    si gentile AIUTAMIIIIIIIII
    Felicità e Prosperità a tutti

  10. #10
    ok, allora se il modello è sempre il medesimo, ovvero:

    species: nome altronome Parte da eliminare

    semplicemente exploderei la stringa e terrei il secondo e il terzo valore

    tipo

    $var = explode(" ", $string);

    $FinalString = $var[1] . $var[2];

    Questo SE il modello è sempre quello
    PHP LEARN - Guide, tutorial e articoli sempre aggiornati
    NUOVO: standardLib; il potente framework PHP é ora disponibile
    *******************************************
    Scarica oggi la tua copia di MtxEventManager

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.