0

次の data.csv を検討してください。

 "1", "2", "3", "4"
 "5", "6", "7", "8"
 "9","10","11","12"
"13","14","15","16"
"17","18","19","20"
"21","22","23","24"
"25","26","27","28"
"29","30","31","32"
"33","34","35","36"

実際には、行と列はもっと長くなりますが、原理は同じです。

csv ファイルを読み取り、引用符を削除し、連続する 3 行ごとに連結して、次の出力をフォーマットする方法が必要です。

1,2,3,4,5,6,7,8,9,10,11,12
13,14,15,16,17,18,19,20,21,22,23,24
25,26,27,28,29,30,31,32,33,34,35,36

私は今持っています:

$path = "data.csv";
$row = 0;
$newrow = 0;
$newrows = array();
if (($handle = fopen($path, "r")) !== FALSE) {
  while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
    $newrows[$newrow] = implode("," $data);
    if ($row % 3) $newrow++;
    $row++;
  }
  fclose($handle);
}

私がやろうとしているのは、データが現在の新しい行に追加される配列「newrows」(以下を参照) を作成することですが、$row は 3 で割ることはできません。

$newrows = array (
  [0] = "1,2,3,4,5,6,7,8,9,10,11,12",
  [1] = "13,14,15,16,17,18,19,20,21,22,23,24",
  [2] = "25,26,27,28,29,30,31,32,33,34,35,36"
)

私のコードは明らかに機能していませんが、続行する方法について混乱しています。あなたは知っていますか?どんな助けでも大歓迎です:-)

edit私は間違いを犯したようです。出力は「3行ごとに連結」ではなく、「3行ごとに連結」する必要があるため、次のようになります。

  • 3行ごとに前の3行に連結されます
  • 行 4 (1 + 3) と 7 (1 + 3 + 3) は行 1 に連結されます
  • 行 5 (2 + 3) と行 8 (2 + 3 + 3) は行 2 に連結されます
  • 行 6 (3 + 3) と 9 (3 + 3 + 3) は行 3 に連結されます

出力は配列になります。

array (
  [0] => 1,2,3,4,13,14,15,16,25,26,27,28
  [1] => 5,6,7,8,17,18,19,20,29,30,31,32
  [2] => 9,10,11,12,21,22,23,24,33,34,35,36
)

私はこれを試しましたが、連結が正しくありません:

$path = "data.csv";
$row = 1;
if (($handle = fopen($path, "r")) !== FALSE) {
  while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
    for ($i = 1; $i <= 3; $i++) {
      if ($row % $i == 0) $newrows[$i] .= implode(",", $data);
    }
    $row++;
  }
}

print_r($newrows);

Array (
  [1] => 1,2,3,45,6,7,89,10,11,1213,14,15,1617,18,19,2021,22,23,2425,26,27,2829,30,31,3233,34,35,36
  [2] => 5,6,7,813,14,15,1621,22,23,2429,30,31,32
  [3] => 9,10,11,1221,22,23,2433,34,35,36
)

PS実際には、csvははるかに大きく、147行ごとに前の147行に連結する必要がありますが、原則は同じだと思います。

4

1 に答える 1

4

while ループにはいくつかの作業が必要です。

$newrow = 0; $row = 1;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
    if( !isset( $newrows[$newrow])) $newrows[$newrow] = '';
    $newrows[$newrow] .= implode(",", $data);
    if ($row % 3 == 0) {
        $newrow++;
    } else {
        $newrows[$newrow] .= ', ';
    }
    $row++;
}

主な変更点:

  • $row1 から始まるため、最初の 3 回の反復は同じエントリにマップされます。
  • $newrows[$newrow] = '';正しく初期化されています。
  • $row % 3は と比較され== 0、3 行ごとに正しく終了しているかどうかが判断されます。
  • $newrows[$newrow]に設定されて.= implode(",", $data);います。これにより、継続的に行が連結されます。そうしないと、最後の反復のみが元のコードに保持されます。
于 2012-07-14T21:51:15.323 に答える