0

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

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

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

谢谢你的帮助。

4

3 回答 3

0

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

于 2012-09-05T14:07:50.567 回答
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 );
于 2012-09-05T14:11:07.653 回答
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 中的所有列(如果它们已经存在)。如果没有:为其添加一个新列。如果是,请保持原样...

于 2012-09-05T14:17:20.367 回答