解析csv的第一行并在数据库中创建表

时间:2012-09-05 14:04:17

标签: php mysql

我正在使用PHP的cron作业每晚下载新的csv。每个csv通常大致相同,可能一个月内一个字段是新的。我需要获取新字段并将其附加到数据库。我不知道如何获得新字段的类型。我看到了其他人对gettype()的问题,但我不确定这是否会起作用,因为数据在csv中,所以当某些需要浮点数或整数时它们都不是字符串吗?我如何检查类型?

第二个问题,是否有办法检查表格中是否没有名称?例如,如果他们添加了一个名为foo52的新字段,并且我的数据库中有foo1到foo51,那么是否有一种快速搜索不存在的字段的方法,或者我是否必须为每个字段使用select语句当它是假的时候附加它?

我使用MySQL作为我的数据库。

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

我发现parsecsv-for-php库非常便于[re | de]构建CSV数据。

答案 1 :(得分:0)

关于获取类型的第一个问题是,只需尝试转换数据本身,然后查看数据是否与==比较相同。

所以,

some,data,is,123

读完数据后,您可以尝试转换为各种类型,如字符串,整数等等......然后就可以确定数据的类型。

对于第二个问题,您可以通过执行以下操作获取列名称:

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 );

答案 2 :(得分:0)

对于第一个问题:您可以使用is_numeric()测试它是否为数字。如果没有,请存储为字符串。如果是,请在数据库中将字段创建为数字。如果需要,可以使用正则表达式来检查它是否是您认为需要正确存储的日期或其他数据类型(即不是默认文本)

对于第二个问题:在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中的所有列(如果已存在)。如果不是:为它添加新的列。如果是,请保持原样......