1

php を使用して csv ファイルを mysql データベースに解析する方法を教えてください。php ドキュメントから読み取ったビットから、データベースに読み取っている行に条件を追加して、条件を満たす値のみを取得する方法や可能性があるかどうかはわかりません。条件がデータベースに渡されます。

たとえば、現在、次のようなcsvファイルがあります

0001D,5879
0001E,0521
0001F,4587
0001G,2220
0001H,2482
0001I,9087
0001J,2255
0001K,2247

コンマの前のコードは16進値のみであると想定されています。私がやりたいのは、16進コード(0-9)-(AF)を表していない行(16進値とそのコード)を除外することです...どのように達成できるかについて何か考えはありますか?

4

2 に答える 2

0

このコードは、このfgetcsv関数を使用して、csvファイルから一度に1行を解析し、区切られた各フィールドを配列に入れて、その配列を返します。例のcsvでは、返される配列には2つのフィールドのみが含まれます。

fgetcsv次に、からの戻り値がそうでないfalseことを確認した後null、コードは、配列の最初のフィールドに、を使用して[GZ]の範囲内の非16進文字が含まれているかどうかを確認しますpreg_match。そうでない場合は、配列の2つのフィールド(csvファイルからの行を表す)を新しい配列に配置します。これは後で操作できます。

<?php
$fileName = "test.csv";
$hexLines = array();

if (($file = fopen($fileName, "r")) !== false)
{
    while (($line = fgetcsv($file, 0, ",")) !== false)
    {
        if (!empty($line))
        {
            // IF first field only has hex chars
            if (preg_match('/^[0-9A-F]+$/', $line[0]) === 1) 
            {
                $hexLines[] = array($line[0], $line[1]);
            }
        }
    }
    fclose($file);
}
print_r($hexLines);

ちなみに、上記のコードはPHPバージョン5.2.xと5.3.xの両方で機能します。5.3を使用することを100%確信している場合は、SplFileObject代わりにを使用してコードを記述します。これは、オブジェクト指向であり、上記の関数よりも少し使いやすいためです。

于 2011-06-27T03:50:05.177 に答える
0

可能であれば、PHP なしでこれを行う方がはるかに優れています。mysqlimportを使用してファイルをインポートしてから、次を使用します。

-- assuming you use "ID" as your first column like the example 
-- on the mysqlimport page
DELETE FROM <tablename> WHERE CONV(CONV(ID, 16, 10), 10, 16) != 
                              TRIM(LEADING '0' FROM ID);

どうしたの?

  1. まず、すべてをテーブルにインポートしました。
  2. 次に、16 進数であるはずのすべての列を調べました。それらを 16 進数に変換して元に戻すことができず (有効な 16 進数にのみ当てはまり、それ以外はすべて切り捨てられます)、それ自体のトリミングされたバージョンと一致する (先頭の 0 を考慮する必要がある) 場合、それらは有効ではありません。

PHP を使用する必要がある場合は、個人的には MySQL の INSERT を継続的に使用し、上記の DELETE を呼び出します。私はそれがより速いことにお金を賭けます。

于 2011-06-27T04:16:08.710 に答える