Domanda

Sto cercando di leggere i dati da un file a.csv per scaricarli su una pagina Web come testo.

È la prima volta che lo faccio e ho riscontrato un brutto piccolo problema.

Il mio file .csv (che viene aperto da Excel per impostazione predefinita), ha più righe e leggo il tutto come una stringa lunga.

in questo modo:

$contents = file_get_contents("files/data.csv");

In questo file di esempio che ho creato, ci sono 2 righe.

  

Paul Blueberryroad   85 us Flashlight, Bag 20 November,   2008, 16:39

     

Hellen Blueberryroad   85 us lens13mm, Flashlight, Bag, ExtraBatteries November   20, 2008, 16:41:32

Ma la stringa letta da PHP è questa:

Paul; Blueberryroad 85; us; Flashlight, Bag; 20 novembre 2008, 16:39 Hellen; Blueberryroad 85; us; lens13mm, Flashlight, Bag, ExtraBatteries; 20 novembre 2008, 16:41:32

Lo sto dividendo con:

list($name[], $street[], $country[], $accessories[], $orderdate[]) = split(";",$contents);

Quello che voglio è che $ name [] contenga " Paul " e "Hellen" come il suo contenuto. E gli altri array ricevono i valori delle rispettive colonne.

Invece ottengo solo Paul e il contenuto di $ orderdate [] è

  

20 novembre 2008, 16:39 Hellen

Quindi tutte le righe sono concatenate. Qualcuno può mostrarmi come posso ottenere ciò di cui ho bisogno?

EDIT: soluzione trovata, solo una cosa che resta:

L'ho risolto ora usando questo pezzo di codice:

$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);

Per qualche ragione, anche se il mio file CSV ha solo 2 righe, restituisce 2 array e 1 booleano. I primi 2 sono i miei array di dati e il valore booleano è 0.

È stato utile?

Soluzione

Stai meglio usando fgetcsv () che è a conoscenza della struttura dei file CSV e ha opzioni designate per la gestione di file CSV. In alternativa, puoi utilizzare str_getcsv () sui contenuti di il file invece.

Altri suggerimenti

La funzione file () legge un file in un array, ogni riga è una voce della matrice.

Quindi puoi fare qualcosa del tipo:

$rows = array();
$name = array();
$street = array();
$country = array();

$rows = file("file.csv");
foreach($rows as $r) {
    $data = explode(";", $r);
    $name[] = $data[0];
    $street[] = $data[1];
    $country[] = $data[2];
}

L'ho risolto ora usando questo pezzo di codice:

$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);

Per qualche ragione, anche se il mio file CSV ha solo 2 righe, restituisce 2 array e 1 booleano. I primi 2 sono i miei array di dati e il valore booleano è 0.

L'osservazione su fgetcsv è corretta.

Risponderò comunque alla tua domanda, a scopo educativo. Per prima cosa, non capisco la differenza tra i tuoi dati (con virgole) e la stringa "quotata da PHP" (sostituisce alcuni spazi con punti e virgola, ma non tutti?). PS .: Ho guardato il codice sorgente del tuo messaggio, sembra uno strano mix di TSV (tabs) e CSV (coma).

Inoltre, se vuoi procedere in questo modo, devi prima dividere il file in righe, quindi le righe in campi.

Il modo migliore è ovviamente fgetcsv () come sottolineato.

$f = fopen ('test.csv', 'r');
while (false !== $data = fgetcsv($f, 0, ';'))
    $arr[] = $data;
fclose($f);

Ma se hai il contenuto in una variabile e vuoi dividerlo, e str_getcsv non è disponibile puoi usare questo:

function str_split_csv($text, $seperator = ';') {
    $regex = '#' . preg_quote($seperator) . '|\v#';
    preg_match('|^.*$|m', $text, $firstline);
    $chunks = substr_count($firstline[0], $seperator) + 1;
    $split = array_chunk(preg_split($regex, $text), $chunks);
    $c = count($split) - 1;
    if (isset($split[$c]) && ((count($split[$c]) < $chunks) || (($chunks == 1) && ($split[$c][0] == ''))))
        unset($split[$c]);
    return $split;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top