1

何千もの数字が互いに下にある CSV ファイルがあります。これを使用して単純化しましょう。

4
7
1
9
3
3
8
6
2

私が望むのは、キーごとに3つの数字を持つ配列を出力することです(コンマで内破されます):

array (
  [0] => 4,7,1
  [1] => 9,3,3
  [2] => 8,6,2
)

CSVを読んで、なんとかこれにたどり着きました:

$path = "data.csv";
$row = 1;
if (($handle = fopen($path, "r")) !== FALSE) {
  while (($data = fgetcsv($handle, 1000, "\r\n")) !== FALSE) {
    $cell = 0;
    $table[$row][$cell] = $data[0];
    $cell++;
  }
  fclose($handle);
}

必要な出力を取得するために $row と $cell をどこに置く必要があるかについて、私は混乱しています。手伝ってくれる?

4

4 に答える 4

3

これを使用して、私はテストして動作します:

<?php
$path = "data.csv";
$array = explode("\n", file_get_contents("data.csv"));
$numbers = array();
foreach(array_chunk($array, 3) as $number){
    $numbers[] = implode(", ", $number);
}
print_r($numbers);
?>
于 2012-05-02T20:27:14.653 に答える
2

小さいもの(すでに別の回答を受け入れていたとしても)ですが、それが「より良い」という意味ではありません(それほど読みやすいわけではないため)。それでも、そこからいくつかのトリックを学ぶことができます:

$path = "data.csv";
$datas = array_chunk(explode("\n",file_get_contents($path)),3);
array_walk($datas, create_function('&$v,$k', '$v = implode(\', \', $v);'));
var_dump($datas);

以前のものよりもはるかに優れています:

$path = "data.csv";  // path to the file
$datas = explode("\n",file_get_contents($path)); 
// $datas contains an array with each csv line as an array row
$finalArray = array(); // empty array we will fill
$datas = array_chunk($datas, 3); // http://fr.php.net/manual/en/function.array-chunk.php
foreach($datas as $data){
    $finalArray[] = implode(', ', $data);
}
var_dump($finalArray);

前回のもの :

$path = "data.csv";  // path to the file
$row = 0; // initializing
$datas = explode("\n",file_get_contents($path)); 
// $datas contains an array with each csv line as an array row
$finalArray = array(); // empty array we will fill
// Let's loop $datas \o/
foreach($datas as $index => $data){ // 
    $finalArray[$row] = isset($finalArray[$row]) ? $finalArray[$row].', '.$data : $data; // filling the array
    if(($index+1)%3 == 0) $row++; // We jump from a row to another every 3 lines
}

var_dump($finalArray);
于 2012-05-02T20:15:24.830 に答える
1

そして、ここに私のコードがあります:

//filter for empty lines
function remove_empty($e){
if(trim($e)!="") return true;
}

//reading the csv file and building the integer array
$arr = array_filter(explode("\r\n",file_get_contents("test.csv")),"remove_empty");
//new array initialization
$newArr = array();
//selecting 3 values in one loop
for($i=0;$i<count($arr);$i=$i+3){
    $newArr[] = implode(",",array($arr[$i],$arr[$i+1],$arr[$i+2]));
}

print_r($newArr);
于 2012-05-02T20:25:17.693 に答える
1

サイクル外でセルを宣言する必要があります。そうしないと、常にリセットされます...

必要なコードは次のとおりです。

$path = "data.csv";
$row = 0;
$cell = 0;
if (($handle = fopen($path, "r")) !== FALSE) {
  while (($data = fgetcsv($handle, 1000, "\r\n")) !== FALSE) {
    $table[$row][$cell] = $data[0];
    $row += $cell == 2 ? 1 : 0; //If its last cell, increase row, else do nothing
    $cell = $cell == 2 ? 0 : $cell+1; //if its last cell, reset to 0, else add 1
  }
  fclose($handle);
}

わかりやすいと思います

于 2012-05-02T20:11:26.147 に答える