phpにて、1.csvと2.csvのファイルから3.csvのファイルを作成したいのです。

私の考える動き方としては、1.csvの先頭から順番に2.csvのデータを参照しながら、3.csvのデータを置き換えていくのですが、1.csvのeは2.csvにないため、2.csvに1005,eを追加して、さらに3.csvに1005を追加するとプログラムを作りたいのです。
どうかご教授お願いいたします。

1.csv(元々あるファイル)

a
b
c
d
e


2.csv(元々あるファイル)

1001,a
1002,b
1003,c
1004,d

2.csv(データが追加されたファイル)

1001,a
1002,b
1003,c
1004,d
1005,e

3.csv(新しく作るファイル)

1001
1002
1003
1004
1005

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/09/30 00:23:26
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:i4ooon No.1

回答回数56ベストアンサー獲得回数20

ポイント100pt

こんな感じでしょうか?

画面には何もエコーしませんが、PHPと同階層に

1.csvがあれば、初回起動時は2.csvと3.csvを作ります。

2.csvはこれまでの対応テーブルがすべて存在すると解釈して良いんですよね?

その前提で、2回目以降は2.csvには存在しないデータが1.csvに追加されたときのみ2.csvも更新します。

3.csvは1.csvの品番のみのようなので、常に上書きしています。

define( "SERIAL_BASE", 1000 );

$data1 = file( "1.csv" );

if ( ! file_exists( "2.csv" ) ) {

$fp = fopen( "2.csv", "w" );

$serial = SERIAL_BASE;

foreach( $data1 as $value ) {

fputs( $fp, ++$serial . "," . $value );

$master[ $serial ] = $value;

}

fclose( $fp );

} else {

$tempCSV = file( "2.csv" );

foreach( $tempCSV as $value ) {

$tempDATA = explode( ",", $value );

$serial = $tempDATA[ 0 ];

$master[ $serial ] = $tempDATA[ 1 ];

}

}

$masterMAX = ++$serial;

$data1 = file( "1.csv" );

foreach( $data1 as $d1 ) {

$exist = false;

foreach( $master as $key => $value ) {

if ( $value == $d1 ) {

$exist = true;

$serial = $key;

break;

}

}

if ( $exist == true ) {

$output3[] = $serial;

} else {

$output2[] = $masterMAX++ . "," . $d1;

}

}

if ( is_array( $output2 ) ) {

$fp = fopen( "2.csv", "a" );

foreach( $output2 as $value ) {

fputs( $fp, $value );

}

fclose( $fp );

}

$fp = fopen( "3.csv", "w" );

foreach( $output3 as $value ) {

fputs( $fp, $value . "\n" );

}

fclose( $fp );

?>

id:miipa

回答ありがとうございます!

早速動かしています。

>3.csvは1.csvの品番のみのようなので、常に上書きしています。

3.csvに品名と品番を書くにはどうすればいいでしょうか?

2009/09/29 22:12:06
  • id:Mook
    数字に規則性はあるのですか。


    たとえば、3.csv は最初の行から最後の行まで連番になるのでしょうか。
  • id:miipa
    Mookさん、いつもありがとうございます。
    先回、ポイント払わずだったので非常に申し訳なく思っています。

    >数字に規則性はあるのですか。
    たとえば、3.csv は最初の行から最後の行まで連番になるのでしょうか。

    1.csvが定期的に更新されていくので、
    b
    c
    e
    のみになったりします。

    それに対する3.csvは
    b1002
    c1003
    e1005
    となり、連番ではなくなります。

  • id:tezcello
    1.csv : 品名データ(入力データ)
    2.csv : 品名-品番照合テーブル
    3.csv : 品番データ(出力データ)
    で、「新規品名の場合、自動で品番を割り当てる」機能が付いているという事でしょうか?
  • id:standard_one
    1000以上の2.csvで使われていない数字
    とか
    2.csvに存在する最も大きい数字に1を足したもの
    とか、そんな感じで具体的に提示してもらえればいいと思いますよ
  • id:Mook
    新しいデータがあったときにどのようなロジックで番号を採番するかのロジックが不明です。

    例えば 1.csv で
    a
    b
    c
    d
    e
    f
    g

    のとき、2.csv が下記のようであったとき、
    1001,a
    1007,c
    1012,e
    1025,g

    のとき新しい 2.csv はどのようになるのでしょうか。
    適当な番号でよいのですか。

    また 2.csv, 3.csv の各ファイルの番号は間隔は異なっていても必ず昇順なのでしょうか。
  • id:miipa
    tezcelloさんへ
    >1.csv : 品名データ(入力データ)
    2.csv : 品名-品番照合テーブル
    3.csv : 品番データ(出力データ)
    で、「新規品名の場合、自動で品番を割り当てる」機能が付いているという事でしょうか?

    まさにそのとおりです。
  • id:miipa
    standard_oneさんへ

    >1000以上の2.csvで使われていない数字
    とか
    2.csvに存在する最も大きい数字に1を足したもの
    とか、そんな感じで具体的に提示してもらえればいいと思いますよ

    「1000以上の数字で、2.csvに存在する最も大きい数字に1を足したもの」です!


  • id:miipa
    Mookさんへ

    >新しいデータがあったときにどのようなロジックで番号を採番するかのロジックが不明です。

    例えば 1.csv で
    a
    b
    c
    d
    e
    f
    g

    のとき、2.csv が下記のようであったとき、
    1001,a
    1007,c
    1012,e
    1025,g

    のとき新しい 2.csv はどのようになるのでしょうか。
    適当な番号でよいのですか。

    2.csvは過去のデータ(1.csvの古いヴァージョン)も持っているので、
    abcdefgは過去に出現した順と考えています。
    そのため、2.csvには
    1001,a
    1002,b
    1003,c
    1004,d
    1005,e
    1006,f
    1007,g
    と登録されているのが前提で考えております。
    今回の質問ではbdfが2.csvにはないので、それらのデータが過去に出現していないデータと考えれば、2.csvは、
    1001,a
    1007,c
    1012,e
    1025,g
    1026,b
    1027,d
    1028,f
    となります。非常にわかりにくくてすいません。

    >また 2.csv, 3.csv の各ファイルの番号は間隔は異なっていても必ず昇順なのでしょうか。
    昇順でなくてもかまいませんが、1.csv,2.csvファイルを作成する過程で昇順にソートしているので、データは表示上昇順のため、そのように書いています。
    このあたり説明がうまく出来てないかもしれません。
    結局、
    1.csvの商品に対して、それぞれが異なる品番を有していること。
    商品が更新されるので、新しい商品には、異なる品番を有したいこと。
    そして、その品番は過去に出現したなら同じ品番であること。
    を実現するためのプログラムということです。
    その考えで、1.csvに品番を加えた3.csvを作成したいのです。
  • id:Mook
    ということは 1.csv と 2.csv の並び順は一致しなくてよいということですか?
    それとも新しいデータは必ず、末尾にしか現れないということでしょうか。
  • id:miipa
    tezcelloさんへ

    >1.csv : 品名データ(入力データ)
    2.csv : 品名-品番照合テーブル
    3.csv : 品番データ(出力データ)
    で、「新規品名の場合、自動で品番を割り当てる」機能が付いているという事でしょうか?

    まさにそのとおりです。

    と書きましたが、1.csvは品名データではなく、品名のカテゴリデータでした。
    間違った記述をしてすいません。
  • id:miipa
    Mookさんへ
    すいません。皆さんの質問に対する回答として、
    1.csvは品名データと書いてしまいましたが、品名のカテゴリデータでした。

    1.csvを作成する前に、
    商品一覧があり、その商品一覧データを元に、カテゴリデータを抽出して、ソートをかけております。

    そして、
    >ということは 1.csv と 2.csv の並び順は一致しなくてよいということですか?
    それとも新しいデータは必ず、末尾にしか現れないということでしょうか。
    並び順は一致しなくてもかまいませんが、新しいデータは、1.csvのデータの中で新しいカテゴリデータが出現したときに新しい品番を取得するので、自分としては昇順の方法しか思い浮かびません。
  • id:Mook
    もうすでに回答がついたようなので質問に対するコメントですが、仕様をもう少し明確に記載して質問された
    方が解決が早いように思います。
    csv の名前を 1,2,3 ではなく、適切なファイル名を付けるだけでもだいぶ違うと思いますよ。


    i4ooon さん、
    コードの回答にははてな記法のスーパーpre記法(シンタックス・ハイライト)が見やすいですよ。
    http://hatenadiary.g.hatena.ne.jp/keyword/%E3%81%AF%E3%81%A6%E3%81%AA%E8%A8%98%E6%B3%95%E4%B8%80%E8%A6%A7
  • id:miipa
    Mookさんへ

    今後質問する際には、仕様をちゃんと整理してから行うようにします。
    ファイル名やデータもおっしゃるとおりしっかり吟味してから行うようにしますので、今後ともよろしくお願いいたします。

  • id:i4ooon
    > 3.csvに品名と品番

    2箇所の修正でOKです。

    品名追加のためにPHPコードの下から17行目付近を
    $output3[] = $serial;

    $output3[] = $serial . "," . $d1;
    に変更し、

    不要な改行コードを無くすために同じく下から3行目を
    fputs( $fp, $value . "\n" );

    fputs( $fp, $value );
    に変更します。

    揚げ足かもしれないけど、品名→品番の順なら、1箇所目の修正は
    $output3[] = $d1 . "," . $serial;
    ですね。
  • id:miipa
    ご丁寧にありがとうございます。
    できました!
    今後ともよろしくお願いいたします!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません