1

以前の投稿を作成しましたが、問題を正しく定式化していませんでした。したがって、前の質問のように見えるかもしれませんが、そうではありません。次の 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"

実際には、行と列はもっと長くなりますが、原理は同じです。出力は次のようになります。

  • 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
)

@nickbのおかげで、私は今持っています:

$path = "data.csv";
$newrow = 1; $row = 1;
if (($handle = fopen($path, "r")) !== FALSE) {
  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++;
  }
}

print_r($newrows);

しかし、これは「3行ごと」ではなく、「3つの連続するすべての」行を互いに連結しました。3行ごとに連結する方法を誰が教えてくれますか? 私はこれを試しましたが、奇妙な方法で連結されます:

$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
)

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

4

2 に答える 2

0

編集:代わりにできること(そして実際にJavaで示されているよりスマートなソリューションは何ですか)は次のとおりです。

String[] newarray = new String[147];
for(int i = 0; i < yourarray.length; i++){
    newarray[i%147].concat(yourarray[i]);
}

String[] を必要な配列タイプに置き換え、concat() メソッドを配列の連結に使用するメソッドに置き換えます。コードの要点は、元の配列のインデックス 147n+C の要素 (非負の整数 n と整数 C < 147 の場合) を新しい配列のインデックス C の要素にマップする何らかの方法が必要だということです。 、これは本質的に剰余算術の目的です。

于 2012-07-14T22:48:33.763 に答える
0

一般的なロジックは次のとおりです。

  • n番目の行である行を取ります
  • x を n/3 の床に等しくする
  • 行 n の内容を出力行 x に追加します

私のPHPは錆びすぎて、それを行うための正確なコードを書くことができませんが、あなたが持っているものは確かにそれをしません.

于 2012-07-14T22:51:36.650 に答える