1

次の形式のCSVがあります。

Bill,Smith,123 Main Street,Smalltown,NY,5551234567
Jane,Smith,123 Main Street,Smalltown,NY,5551234567
John,Doe,85 Main Street,Smalltown,NY,5558901234
John,Doe,100 Foo Street,Bigtown,CA,5556789012

つまり、1つのフィールドが一意ではありません。2人が同じ名前を持つことも、2人が同じ電話を持つこともできますが、すべてのフィールドを考慮すると、各回線自体が一意です。

行ごとに一意のIDを生成する必要がありますが、ランダムにすることはできません。また、将来的にCSVの行を取得して、データベースにクエリを実行しなくても、その人の一意のIDが何であるかを把握できるようにする必要があります。

PHPでこれを行う最速の方法は何でしょうか?何百万もの行に対してこれを行う必要があるため、各行md5()の文字列全体を'実際には実用的ではありません。使用すべきより良い関数はありますか?

4

4 に答える 4

1

一意のIDをフィールドとして追加するだけではどうでしょうか。

$csv=file($file);
$i=0;
$csv_new=array();
foreach ($file as $val){
    $csv_new[]=$i.",".$val;
    $i++;
}

そして、$csv_newを新しいcsvファイルとして出力します。

汚いですが、それはあなたのために働くかもしれません。

于 2012-08-05T06:17:33.707 に答える
1

なぜだけではないのですか

CREATE TABLE data (
    first VARCHAR(50),
    last  VARCHAR(50),
    addr  VARCHAR(50),
    city  VARCHAR(50),
    state VARCHAR(50),
    phone VARCHAR(50),
    id    INT UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (id)
);

LOAD DATA [LOCAL] INFILE 'file.csv'
INTO TABLE data
(first,last,addr,city,state,phone);
于 2012-08-05T06:20:31.723 に答える
1

後で行のテキストのみからIDを再構築できるようにする必要がある場合は、ハッシュアルゴリズム必要になります。ただし、MD5である必要はありません。

「数百万のID」は、最近のCPU(または特にGPU。SpeedHashingに関するJeffの最近のブログを参照)では実際には問題ではないため、PHPとは異なる言語でハッシュを実行することをお勧めします。私が見ることができる唯一の問題は衝突です。生成されたハッシュが実際に一意であることを確認する必要があります。その可能性は、エントリの数、使用されているアルゴリズム、およびハッシュの長さによって異なります。

ジェフの記事によると、MD5はすでにそこにある最速のハッシュアルゴリズム(1秒あたり10〜20,000百万のハッシュ)にすぎませんが、NTLMは2倍高速であるように見えます。

于 2012-08-05T06:25:17.167 に答える
1

あなたの言っていることは理解できますが、意味がわかりません。データベースで自動インクリメントする一意のIDを作成するのが最適なルートです。2番目のルートは、csvにcell = a1 + 1のようなものを作成し、それを行全体にドラッグすることです。PHPではあなたは約。ファイルを読み取り、date(ymd)。$ idなどの先頭に追加してから、ファイルに書き戻します。繰り返しますが、これを行うのはばかげているようで、データベースルートが最適です。pciコンプライアンスを念頭に置き、常にデータを暗号化します。後でコードを投稿します。現時点ではPCを使用していません。

久しぶりですが、データベースに行が作成されないようにする必要があるような状況を見つけ、一意に設定されたde_dupという別の列を作成しました。次に、作成時に使用された日付('ymd')。md5(implode($ selected_csv_values));の各行について これにより、特定の情報(名、姓、クレジットカード番号、請求先住所など)が異なる場合を除き、顧客は特定の日に注文を作成できなくなります。

于 2016-05-28T21:53:52.903 に答える