webForumDet fria alternativet

Parse'a CSV fil med PHP

3 svar · 532 visningar · startad av MickeA.com

MickeA.comMedlem sedan feb. 20034 441 inlägg
#1

Hej,
Jag har en csv fil som är semikolon separerad med x antal rader och 4 kolumner.

Sprang på det här skriptet på nätet:

[<?
function csv_explode($str, $delim = ',', $qual = "\"") {
  $len = strlen($str);
  $inside = false;
  $word = '';
  for ($i = 0; $i < $len; ++$i) {
    if ($str[$i]==$delim && !$inside) {
      $out[] = $word;
      $word = '';
    } else if ($inside && $str[$i]==$qual && ($i<$len && $str[$i+1]==$qual)) {
      $word .= $qual;
      ++$i;
    } else if ($str[$i] == $qual) {
      $inside = !$inside;
    } else {
      $word .= $str[$i];
    }
  }
  $out[] = $word;
  return $out;
}

Nu vill jag läsa in min csv fil och sen skriva ut resultatet som en HTML tabell.

Såhär har jag testat:

$template = "./data.csv";
$fp = fopen($template, "r");
$data = fread($fp, filesize($template));
fclose($fp);

$res = csv_explode($data, $delim = ";", $qual = "\"");

for($i = 0; $i <= sizeof($res); $i++){
	echo $res[$i] . " " . (($i % 4 == 0) ? "<br />" : "");
}

Tanken är att till en början skriva ut resultatet såhär:

ID1   KOL1_1  KOL1_2   KOL1_3
ID2   KOL2_1   KOL2_2   KOL2_3
....

Men skriver jag ut arrayen som den här funktionen ovan skapar, blir det:

Array
(
    [0] => NAMN1
    [1] => 90
    [2] => 20
    [3] => 110
NAMN2
    [4] => 20
    [5] => 80
    [6] => 100
NAMN3
    [7] => 60
    [8] => 30
    [9] => 90
)

"Namn2", "Namn2" osv. verkar hamna utanför min array, eller vad är det som händer?

Jag skulle vilja att array'en såg ut såhär:

Array
(
    [0] => NAMN1
    [1] => 90
    [2] => 20
    [3] => 110
    [4] => NAMN2
    [5] => 20
    [6] => 80
    [7] => 100
    [8] => NAMN3
    [9] => 60
    [10] => 30
    [11] => 90
)

Hur skriver man om funktionen ovan för att uppnå detta?

Tack!

MickeA.comMedlem sedan feb. 20034 441 inlägg
#2

Googlade lite mer och hittade den här:
http://www.phpclasses.org/browse/package/2331.html

MattiMedlem sedan dec. 19996 592 inlägg
#3

Annars så fungerar funktionen ovan bra om man läser in och "explodar" csv-filen rad för rad.

$template = "./data.csv"; 
$data = file($template);
$rows = count($data);

for ($i=0; $i < $rows; $i++) {
$currentRow = csv_explode($data[$i],';');
	foreach ($currentRow as $value) {
		$allValues[] = $value;
	}
}
print_r($allValues);

data.csv

"NAMN1";"25";"25";"50"
"NAMN2";"30";"30";"30"
"NAMN3";"54";"12";"33"

ger:

Array
(
    [0] => NAMN1
    [1] => 25
    [2] => 25
    [3] => 50

    [4] => NAMN2
    [5] => 30
    [6] => 30
    [7] => 30

    [8] => NAMN3
    [9] => 54
    [10] => 12
    [11] => 33
)
MickeA.comMedlem sedan feb. 20034 441 inlägg
#4

Aha, såpass.

Tack!

137 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)