Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Caricare e parsare file locale

    Salve,
    ho bisogno di caricare una serie di file di dati locali costituiti da tabelle di due colonne con due numeri su ogni riga.
    Per far ciò ho iniziato definendomi il seguente file html:

    <body>
    <form name="name" action="loadManager.php" method="post" enctype="multipart/form-data">
    <input type="file" name="textfile" />
    <input type="submit" name="Submit">
    </form>
    </body>

    che invoca il seguente script:
    <?
    include("dbinfo.inc.php");
    mysql_connect($server,$username,$password);
    @mysql_select_db($database) or die( "<=error>=Unable to select database<=/error>=");
    $textfile=$_POST['textfile']['tmp_name'];
    echo "textfile=".$textfile;
    $query="LOAD DATA LOCAL INFILE '$textfile' INTO TABLE points FIELDS TERMINATED BY ' '";
    mysql_query($query);
    ?>

    Tuttavia sul DB non mi carica nulla e per giunta non riesco nemmeno a capire se il problema è nel caricamento, nel parsing o nell'inserimento in quanto non ho idea su come esaminare i valori intermedi - anche $textfile da una stringa vuota.

    Qualcuno mi può aiutare?

    Grazie, Fabrizio

  2. #2
    I dati relativi ai file uploadati si trovano nell'array $_FILES non in $_POST.

  3. #3
    Originariamente inviato da k.b
    I dati relativi ai file uploadati si trovano nell'array $_FILES non in $_POST.
    Sì, grazie: me ne sono accorto dopo aver scritto il post: ora in effetti i dati li inserisce nel DB, ma stranamente carica solo il secondo dato della tabella nella prima colonna e lascia la seconda colonna vuota. Forse può dipendere dal fatto che il primo è il campo chiave che non è float: se è così come faccio a dire a:

    $query="LOAD DATA LOCAL INFILE '$textfile' INTO TABLE points FIELDS TERMINATED BY ' '";

    di caricare i dati che trova su specifiche colonne del DB?

    Inoltre carica solo le prima 4 righe delle 6 presenti.

  4. #4
    Puo' dipendere da com'e' fatto il file di ingresso, quali sono i delimitatori dei campi e quali sono i caratteri di quote.

    Inoltre riguardo le specifiche colonne, cito dalla pagina del manuale:
    By default, when no column list is provided at the end of the LOAD DATA INFILE statement, input lines are expected to contain a field for each table column. If you want to load only some of a table's columns, specify a column list:

    LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);

    You must also specify a column list if the order of the fields in the input file differs from the order of the columns in the table. Otherwise, MySQL cannot tell how to match input fields with table columns.
    http://dev.mysql.com/doc/refman/5.1/en/load-data.html

  5. #5
    Originariamente inviato da k.b
    Puo' dipendere da com'e' fatto il file di ingresso, quali sono i delimitatori dei campi e quali sono i caratteri di quote.

    Inoltre riguardo le specifiche colonne, cito dalla pagina del manuale:

    http://dev.mysql.com/doc/refman/5.1/en/load-data.html
    Grazie: tuttavia inserendo i due campi del db sia tra virgolette che senza non mi carica proprio nulla. Questo è il codice che ho usato:
    $query="LOAD DATA LOCAL INFILE '$textfile' INTO TABLE points (stress,strain) FIELDS TERMINATED BY ' '";

    dove la tabella consiste di 4 campi dei quali gli ultimi due sono stress e strain (il primo è l'indice ed il secondo il riferimento al padre).

    Ora ho tolto l'ultimo pezzo limitandomi a:
    $query="LOAD DATA LOCAL INFILE '$textfile' INTO TABLE points (stress,strain);

    e mi carica al contrario di prima solo la prima colonna.

    Qui segue il contenuto del file che sto cercando di caricare:
    0.04771372 253.0559
    0.09383698 292.0676
    0.2019881 374.7724
    0.3053678 425.7477
    0.3992048 457.9974
    0.5025845 484.5254
    0.6059642 505.3316
    0.7013917 523.5371

  6. #6
    La sintassi corretta e':
    codice:
    LOAD DATA LOCAL INFILE '$textfile' INTO TABLE points FIELDS TERMINATED BY ' ' (stress,strain)

  7. #7
    Originariamente inviato da k.b
    La sintassi corretta e':
    codice:
    LOAD DATA LOCAL INFILE '$textfile' INTO TABLE points FIELDS TERMINATED BY ' ' (stress,strain)
    Wow! Grazie mille: funziona benissimo; stavo facendo prove ma le combinazioni delle keyword sono molteplici...

    Sperando di non approfittare della tua gentilezza, mi sai anche dire come faccio ad impostare un altro campo delle righe che sto scrivendo, partendo da una variabile che gestisco?
    Inoltre, siccome il programma che genera il file è creativo nell'inserimento dei separatori, c'è un modo per dire alla query di separare i campi mediante ALMENO uno spazio vuoto? Ovviamente in caso contrario mi devo processare prima tutti i file per normalizzarli, ma eviterei volentieri, si tratta di 722 file...

    Grazie, Fabry

  8. #8
    Originariamente inviato da fbartolom
    Wow! Grazie mille: funziona benissimo; stavo facendo prove ma le combinazioni delle keyword sono molteplici...

    Sperando di non approfittare della tua gentilezza, mi sai anche dire come faccio ad impostare un altro campo delle righe che sto scrivendo, partendo da una variabile che gestisco?
    Non ho capito la domanda

    Originariamente inviato da fbartolom
    Inoltre, siccome il programma che genera il file è creativo nell'inserimento dei separatori, c'è un modo per dire alla query di separare i campi mediante ALMENO uno spazio vuoto? Ovviamente in caso contrario mi devo processare prima tutti i file per normalizzarli, ma eviterei volentieri, si tratta di 722 file...
    Non credo si possano usare delimitatori non fissi, devi fare l'importazione tramite qualche altro linguaggio oppure processare i file (se sei su unix basta sed).

  9. #9
    Originariamente inviato da k.b
    Non ho capito la domanda


    Non credo si possano usare delimitatori non fissi, devi fare l'importazione tramite qualche altro linguaggio oppure processare i file (se sei su unix basta sed).
    La prima domanda riguarda la possibilità di caricare anche un altro campo della riga: ad esempio sul file ho:
    0.0946236 525.8065
    0.2021505 721.5054
    0.2977420 897.8495
    0.4989247 1035.484
    0.6064516 1041.935
    0.6967742 1044.086

    che corrispondono tutti allo stesso esperimento e vorrei quindi mettere nel campo 'test' di ciascuno di essi il numero dell'esperimento in modo da poterli ritrovare.

    Riguardo i delimitatori bizzarri hai idea di qualcosa per mac o anche per unix - potrei operare anche via terminale - per trattarli tutti in blocco. Penso al grep ma anche lì la sintassi è ardita per fare di queste cose.

  10. #10
    Originariamente inviato da fbartolom
    La prima domanda riguarda la possibilità di caricare anche un altro campo della riga: ad esempio sul file ho:
    0.0946236 525.8065
    0.2021505 721.5054
    0.2977420 897.8495
    0.4989247 1035.484
    0.6064516 1041.935
    0.6967742 1044.086

    che corrispondono tutti allo stesso esperimento e vorrei quindi mettere nel campo 'test' di ciascuno di essi il numero dell'esperimento in modo da poterli ritrovare.
    Se ho capito bene puoi provare cosi':
    codice:
    LOAD DATA LOCAL INFILE '$textfile'
    INTO TABLE points
    FIELDS TERMINATED BY ' '
    (stress,strain)
    SET test = 'numero_esperimento'
    Riguardo i delimitatori bizzarri hai idea di qualcosa per mac o anche per unix - potrei operare anche via terminale - per trattarli tutti in blocco. Penso al grep ma anche lì la sintassi è ardita per fare di queste cose.
    Supponendo che tu debba semplicemente sostituire tutte le sequenze di spazi con un singolo spazio, e che ti trovi nella directory in cui ci sono i file in questione, puoi da riga di comando usare questo:
    codice:
    for i in `ls -1`; do sed -i 's/ \+/ /g' $i; done
    sempre se sed supporta il flag -i, altrimenti devi usare file temporanei.

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.