php - mysql/php 将 csv 导入表中,并在分隔符内包含括号

标签 php mysql sql regex csv

通过 sql 或通过 php 进行数据最小化将 csv 导入 mysql 时,我遇到了一个奇怪的问题。

我有一个来自第三方的 csv(我无法控制并且无法更改),该 csv 以逗号分隔并包含双引号。够简单的。然而,在某些单元格中存在以下数据:

"first" value, secondvalue, thirdvalue, "fourth, value"

现在,当我将其导入 SQL 时,第一个值由于附件而被分割。我怎样才能让它忽略这些单元格,只将它们输入为第一个值,但仍然保留外壳,以便它们在“第四个值”上工作?

当我将其导入表中时,是否有一个可以在每一行上运行的正则表达式(我不介意通过 php 读取行然后使用 INSERT 来逐行导入),或者 SQL 中是否有功能允许这样做?

我已经尝试过以下语句但不起作用

    load data local infile '../htdocs/invoice/upload/importthis.csv' 
    into table items_raw 
    fields terminated by ','  
    enclosed by '"' lines terminated by '\n'
    (date, clid_nu, clid, dnid, dcontext_nu, channel_nu,
    dstchannel_nu, lastapp_nu, lastdata_nu, duration, billsec_nu, disposition_nu, 
    amaflags_nu, accountcode_nu, uniqueid_nu, userfield_nu)

并且还尝试使用OPTIONALLY ENCLOSED BY '"'但这也不起作用

我也尝试过使用 fgetcsv 但我从中得到了相同的结果

有什么想法吗?

编辑

因此正则表达式 "((.*),(.*))" 似乎匹配第四个值,但不匹配第一个值。这是最好的方法还是我把这个事情复杂化了?

最佳答案

对我来说,这看起来像是格式错误的 CSV。此行应该是:

"""first"" value", secondvalue, thirdvalue, "fourth, value"

其中 " 通常用作转义字符。

在 CSV 输入上使用正则表达式的问题是 CSV 不是常规语言。

尝试使用 fgetcsv,看看该函数是否与您的 SQL 导入器具有相同的行为。计算在每行上找到的项目数。您也许能够通过这种方式捕获所有异常情况。

它是否足以检测异常情况,或者您是否也想自动修复它们? - 例如,如果异常数量非常多。

<小时/>

或者,您可以编写自己的 CSV 解析器来读取此内容,并将文件转换为正确的 CSV。

编写 CSV 解析器实际上并不难。如果你愿意的话我可以给你一个大纲。

关于php - mysql/php 将 csv 导入表中,并在分隔符内包含括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23934547/

相关文章:

php - 将数据插入表 - 主键约束

php - SQL - 组织多个发布/记录类型的最有效方法

python - py.test : ImportError: No module named mysql

mysql - 数据库查询计算所有是/否票和它们所属的数据库记录?

sql - SQL Server 中的 INSERT INTO SET 语法

php - 2 个不同的值存储在数据库的一列下

php - 如何使用 "not"as 语句检索数据?

mysql - 由于 orwhere 导致查询忽略条件 - Laravel5

mysql - SQL 仅选择列上具有最大值的行

php - 如何在不选择整个数据库并与 PHP 进行比较的情况下获取哪些 ID 不在数据库中