Pergunta

Eu estou tentando ler dados de a.csv arquivo para ouput-lo em uma página da Web como texto.

É a primeira vez que eu estou fazendo isso e eu correr em um pequeno problema desagradável.

O meu arquivo .csv (que fica openened pelo Excel, por padrão), tem várias linhas e eu li a coisa toda como uma cadeia longa.

como este:

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

Neste exemplo de arquivo que eu fiz, existem 2 linhas.

Paul Blueberryroad 85 nós lanterna, Saco 20 de novembro de 2008, 04:39

Hellen Blueberryroad 85 nós lens13mm, lanterna, Saco, ExtraBatteries novembro 20, 2008, 16:41:32

Mas a string lida pelo PHP é esta:

Paul; Blueberryroad 85; nós, lanterna, Saco, 20 de novembro de 2008 04:39 pmHellen; Blueberryroad 85; nós; lens13mm, lanterna, Saco, ExtraBatteries; 20 de novembro de 2008, 16:41:32

Estou dividindo isso com:

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

O que eu quero é que $ name [] para conter "Paul" e "Hellen", como o seu conteúdo. E as outras matrizes para receber os valores das respectivas colunas.

Em vez disso, obter apenas Paul e o conteúdo de $ orderdate [] é

20 de novembro de 2008 04:39 pmHellen

Assim, todas as linhas são concatenadas. Alguém pode me mostrar como eu posso conseguir o que eu preciso?

EDIT: solução encontrada, apenas uma coisa werid restante:

Eu resolvi isso agora usando este pedaço de código:

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

Por alguma razão, allthough meu arquivo CSV tem apenas 2 linhas, ele retorna 2 matrizes e 1 boolean. O primeiro 2 são meus matrizes de dados e o booleano é 0.

Foi útil?

Solução

Você é melhor fora de usar fgetcsv () que está ciente da estrutura do arquivo CSV e tem opções designado para lidar com arquivos CSV. Alternativamente, você pode usar str_getcsv () sobre o conteúdo da o arquivo em seu lugar.

Outras dicas

O href="http://it.php.net/file" rel="nofollow arquivo () função lê um arquivo em uma matriz, cada linha é uma entrada do array.

Assim, você pode fazer algo como:

$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];
}

Eu resolvi isso agora usando este pedaço de código:

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

Por alguma razão, allthough meu arquivo CSV tem apenas 2 linhas, ele retorna 2 matrizes e 1 boolean. O primeiro 2 são meus matrizes de dados e o booleano é 0.

A observação sobre fgetcsv está correto.

Eu ainda vou responder sua pergunta, para fins educacionais. Primeira coisa, eu não entendo a diferença entre os seus dados (com comas) eo "string lida pelo PHP" (ele substitui alguns espaços com ponto e vírgula, mas não todos?). PS .: Eu olhei para o código-fonte da sua mensagem, parece que uma estranha mistura de TSV (guias) e CSV (coma).

Ao lado, se você quiser ir por este caminho, é necessário dividir primeiro o arquivo em linhas, em seguida, as linhas em campos.

A melhor maneira é, naturalmente, fgetcsv () como fora pontudo.

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

Mas se você tem o conteúdo em uma variável e quero dividi-lo, e str_getcsv está indisponível você pode usar isto:

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top