1

私はCSVファイルをデータベースにインポートする作業を行っていますが、これは複数のステップからなるプロセスです。

手順は次のとおりです。

  • ステップ1:ユーザーがCSVファイルをアップロードします。
  • ステップ2:ユーザーはデータをデータ型に関連付けます。たとえば、CSVのレコードに次のデータが含まれている場合John,Doe,jondoe@gmailcom、ユーザーはドロップダウンボックスから名を選択してデータ値Johnに関連付け、姓をデータ値Doeに関連付けるドロップダウンボックスから選択し、メールアドレスをドロップダウンから選択します。データ値johndoe@gmail.comに関連付けるボックス
  • ステップ3:データベースにデータを挿入する

私の質問は次のとおりです。

1. /ステップ3では、ユーザーが選択した列と元のデータを所有します。

元のデータは次のようになります。

$data = array(
 0 => array('John','Doe','johndoe@gmail.com'),
 1 => array('Foo','Bar','foobar@gmail.com')
);

ステップ2で選択した列は次のようになります。

$columns = array('firstname','lastname','emailaddress')

次のようなSQLクエリを作成するにはどうすればよいですか。

INSERT into contacts (id,firstname,lastname,emailaddress) values (null,'John','Doe','johndoe@gmailcom')

ご覧のとおり、SQLクエリには、配列内にある順序で選択された列があり、その後に値が続きます。列はデータの順序で選択されているので、データは正しい順序であり、その位置の特定の列に関連付けられていると推測できます(たとえば、データ値は ' John'はcolumns配列の最初の位置に関連付けられており、その逆も同様です)。

2. /ユーザーがファイルの最初のアップロードを行うときに、最初のレコードに空白のフィールドがあるcsvファイルを送信する可能性があるというシナリオを考えていました。問題は、csvレコード内の列の数に基づいて、ユーザーがデータに関連付ける列の数を決定することです。この場合、2つの列があり、後続のすべてのレコードには3つの列があります。さて、正しい列数を決定するためにレコードのセット全体をループするつもりはありません。この問題を解決するにはどうすればよいですか?何か案は?

編集

質問2の答えがわかったと思います。csvファイルの解析で、各レコードのカウントを取得できます。解析の最後の最大カウントは私のカウントです。正しいようですか?それに関する問題はありますか?

4

1 に答える 1

1

CSVファイルのデータを解析するには、fgetcsvを確認してください。http://php.net/manual/en/function.fgetcsv.php

ファイルから行をロードし、CSVフィールドの配列を返します。

$data = array();
while (($lineFields = fgetcsv($handle)) !== false) {
    $data[] = $lineFields;
}

これは、PHP5を使用していて、$handleでファイルを開いていることを前提としています。PHP4では、fgetcsvには、読み取る行の最大長の2番目のパラメーターが必要です。

クエリの場合:

$sql = "INSERT into contacts (id," + implode(',', $columns) + ") values";

値の後には何も含めていません。SQLインジェクションから保護するために、プリペアドステートメントを作成する必要があります。また、MySQLを使用している場合、idは自動インクリメントフィールドであり、挿入から省略されている必要があります(MySQLに生成させます)。Postgresを使用している場合は、idフィールドのシーケンスを作成する必要があります。いずれにせよ、データベースにIDを生成させてください。

于 2013-01-25T01:08:33.830 に答える