0

PHPでcronジョブを使用して、毎晩新しいcsvをダウンロードしています。通常、各 csv はほぼ同じで、1 か月に 1 晩でフィールドが新しくなる可能性があります。新しいフィールドを取得してデータベースに追加する必要があります。新しいフィールドの型を取得する方法がわかりません。gettype() で他の誰かの質問を見ましたが、データが csv 内にあるため、それが機能するかどうかはわかりません。フロートまたは int が必要な場合、それらはすべて文字列ではありませんか? タイプを確認するにはどうすればよいですか?

2 番目の質問は、テーブル内に名前がないかどうかを確認する方法はありますか? たとえば、彼らが foo52 という新しいフィールドを追加し、私のデータベースに foo1 から foo51 までがある場合、そこにないフィールドをすばやく検索する方法はありますか? または、各フィールドに対して select ステートメントを使用する必要がありますか? false の場合に追加しますか?

データベースには MySQL を使用しています。

ご協力いただきありがとうございます。

4

3 に答える 3

0

型の取得に関する最初の質問は、単純にデータ自体の変換を試みてから、データが==比較で同等かどうかを確認することです。

そう、

some,data,is,123

データを読み取った後、文字列、int などのさまざまな型への変換を試みることができます。それから、データの型を特定することができます。

2 番目の質問では、次のようにして列名を取得できます。

show columns from db.table_name

in_array次に、新しい列名がデータベースに既に存在するかどうかを簡単にテストできます。

編集:

を使用array_diffすると、CSV から欠落している/新しい列名を簡単に見つけることができます。

csv_names = get_csv_column_names();
sql_names = get_sql_column_names();

new_names = array_diff( csv_names, sql_names );
于 2012-09-05T14:11:07.653 に答える
0

最初の質問: is_numeric() で数値かどうかをテストできます。そうでない場合は、文字列として保存します。はいの場合は、データベースにフィールドを数値として作成します。必要に応じて、正規表現を使用して、それが日付であるか、正しく保存する必要があると思われる他のデータ型であるかを確認できます (つまり、デフォルトのテキストではありません)。

2 番目の質問: Postgres でテーブルのフィールド名を取得するには、次のクエリを使用します。

$sql = "SELECT attname FROM pg_catalog.pg_attribute
                    WHERE attrelid =
                        (SELECT c.oid FROM pg_catalog.pg_class c LEFT JOIN pg_namespace n  ON n.oid = c.relnamespace
                            WHERE c.relname = '$this->tableName' AND n.nspname = 'public')
                        AND attnum > 0
                        AND NOT attisdropped";

MySQL の場合、「db.table_name の列を表示」で実行できるはずです。

フィールドを取得したら、 in_array() を使用して、既に存在するかどうかを確認します...

注意: CSV 内のすべての列が既に存在する場合は、おそらくそれらを確認する必要があります。そうでない場合: 新しい列を追加します。もしそうなら、そのままにしておいてください...

于 2012-09-05T14:17:20.367 に答える
0

parsecsv-for-phpライブラリは、CSV データの [再|脱] 構築に非常に便利であることがわかりました。

于 2012-09-05T14:07:50.567 に答える