php - 通过制表符分隔文本文件的内容更新 MySQL 表(通过 PHP)

标签 php mysql casting

所以除了 PHP 不是多线程的事实之外,我在这方面遇到了很多困难,老实说,这可能是目前唯一发生的好事。

最近我公司换了一个新的数据库。对于我们的旧数据库,我们通过使用一个非常老旧的 Python 程序来更新我们的 mysql 记录(不要问为什么我们有一个数据库加上 mysql),这个程序真的不起作用。现在随着新数据库的实现,我有机会完全摆脱 Python,并决定使用 PHP 来翻译我们新数据库中的信息。

也就是说,我们使用的方法是将数量、价格等所有内容从这个新数据库导出到 excel,然后将文件另存为制表符分隔的文本文件。我将这些文件弹出到一个文件夹中并运行一个 .bat 文件,它调用我的 php 程序,它读取这三个文件,将所有内容存储在数组中,将这些数组的内容转换为 MySQL 准备好的语句,然后将这些信息放入 MySQL 中一个项目。总共需要大约 10 分钟,这实际上很好 - python 脚本过去需要 6 个小时以上。

截至目前,我不太担心速度。在这个脚本中对我进行了很多测试,可以稍后对其进行完善。导致我出现问题的部分(即 TLDR)是某些字段没有更新,我花了很长时间才弄清楚原因。

我有几个价格字段设置为 float 字段。之所以会这样,是因为那些字段的内容会被传送到另一个表的内容中,是float,我不能改变那个表的类型。该表基本上是“不要触摸或更改任何内容,因为它是圣经表”。所有其他 table 都是为容纳那个 table 而 build 的。发送到文本文件中的价格、数量以及基本上任何数字字段都被保存为字符串,而不是 float 或整数。

我做的第一件事是查找类型转换,我尝试了以下方法:

$stmt = $dbh->prepare("INSERT INTO table1(modelNumber, itemName, UPC, OnHand, IsCommitted, OnOrder, quantity, mfgr_num, unitOfMeasure, modelDescription, weight, frozenFor, discontinued, dropship) VALUES (?, ?, ?, CAST(? AS DECIMAL(10, 0)), CAST(? AS DECIMAL(10, 0)), CAST(? AS DECIMAL(10, 0)), CAST(? AS DECIMAL(10, 0)), ?, ?, ?, ?, ?, ?, ?);");

    $stmt->bindParam(1, $mod);
    $stmt->bindParam(2, $item);
    $stmt->bindParam(3, $u);

    $stmt->bindParam(4, $onh);
    $stmt->bindParam(5, $isCommitted);
    $stmt->bindParam(6, $order);

    $stmt->bindParam(7, $in);
    $stmt->bindParam(8, $mfgr);
    $stmt->bindParam(9, $measure);
    $stmt->bindParam(10, $deets);
    $stmt->bindParam(11, $w);
    $stmt->bindParam(12, $fro);
    $stmt->bindParam(13, $dis);
    $stmt->bindParam(14, $dr);

    $onh = $inStock2[$i];           // 1
    $isCommitted = $committed[$i];  // 2
    $order = $ordered[$i];          // 3
    $mod = $modelNumber02[$i];      // 4
    $item = $itemName[$i];          // 5
    $u = $upc[$i];                  // 6
    $in = $onh - $isCommitted;      // 7
    $mfgr = $mfgr_num[$i];          // 8
    $measure = $uom[$i];            // 9
    $deets = $itemDeets[$i];        // 10
    $w = $weight[$i];               // 11
    $fro = $frozenFor[$i];          // 12
    $dis = $disc[$i];               // 13
    $dr = $drop[$i];                // 14

我尝试通过那种类型的转换选择一些东西,它似乎工作正常......但它没有。我正在观察的一个特定示例字段应该填充 2,032。在文本文件中,它显示为“2,032”,带引号。所以这个字段在 MySQL 中被填充为 0。

还有其他三个实例与上述实例相似。我尝试了一种非常简单的方法,试图将 Excel 中的字段转换为 float ...但这似乎没有用。完全喜欢。

所以。建议?我错过了什么吗?我只是输入错误的类型转换吗?我是不是找错树了?是的,我意识到这是一个巨大的插入物。它被插入到的表就像一个临时表,尽管它从未被删除。

编辑:试图放入表中的数据示例。这个 ("2032.00") 是我见过唯一有引号的字段。它下面的字段也没有更新。

841 1333    0.00    0.00    0.00
842 1334    0.00    0.00    0.00
843 1338    0.00    0.00    0.00
844 1339    0.00    0.00    0.00
845 1340    0.00    0.00    0.00
846 1341    0.00    0.00    0.00
847 1344    "2,032.00"  7.00    0.00
848 1345    95.00   0.00    300.00
849 1345EA  60.00   0.00    0.00
850 1346    733.00  41.00   200.00
851 1346EA  67.00   0.00    0.00
852 1348    7.00    0.00    400.00
853 1348EA  21.00   0.00    0.00
854 1349    348.00  1.00    400.00
855 1350    91.00   1.00    300.00
856 1350EA  60.00   0.00    0.00
857 1351    0.00    0.00    1.00
858 1354    10.00   0.00    0.00
859 1357    4.00    12.00   6.00
860 1358    0.00    2.00    1.00
861 1360    0.00    0.00    0.00
862 1361    0.00    0.00    0.00
863 1362    0.00    0.00    0.00
864 1363    0.00    0.00    0.00
865 1364    0.00    0.00    24.00
866 1365    3.00    0.00    24.00
867 1366    0.00    2.00    1.00

编辑 2.0:我将 FLOAT 字段更改为 VARCHAR 以尝试查看它们是否会进入我希望它们进入的表。在这样做的过程中,我意识到该字段实际上包括带有数字的引文,即使引文不在文件开头。因此,这些字段中的一些似乎已经为它们增加了原本不存在的值(value)。我将尝试创建一个提取,这也可能会解决这个问题。

最佳答案

我已经弄清楚我的程序出了什么问题,虽然这不是我最初的想法,而是我遗漏了一些东西。

因为一些字段包含逗号,所以当我将数据从 excel 文件转换为制表符分隔的文本文件时,它们被转换为字符串,并且在数据上添加了引号。因此,为了保留逗号,看起来像 2,323 的值变成了“2,323”。

因为该表在 MySQL 中的字段是 FLOAT 字段,并且它们不能读取逗号,所以我使用以下方法来修复值:

else if($i == 2 || ($i - 2) % $len3 == 0) {
    $stk = str_replace('"', '', $docContents3[$i]);
    $stk = str_replace(',', '', $stk);
    array_push($inStock2, $stk);

我删除了逗号和引号,这解决了我的字段未正确更新的问题,因为即使我删除了引号,逗号也会导致 MySQL 自动截断信息。所以 2,323 变成了 2。这显然非常离谱。

感谢那些试图帮助我并因我缺乏完整信息而受苦的人 - 对于我还没有看到的主题有建议,我现在知道我实际上可以用文件的内容填充表格,我将来可能会使用它来使这个过程更顺利。

换句话说……标点符号。字面意思是标点符号。

关于php - 通过制表符分隔文本文件的内容更新 MySQL 表(通过 PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38778100/

相关文章:

php - 如何生成多个文本框然后插入数据库

php - 在 PHP 中使用序列化将数据存储到数据库中是一个好习惯吗?

javascript - 使用 ajax php mysql 使用 html 链接单击更新数据库

php - 从 MYSQL 输出中对数组进行排序并省略重复值

mysql - 选择按月.年分组的两个日期之间的用户计数,并在计数 = 0 的月份中包含零

php - 如何通过html表单将值记录到mysql数据库中

Java Xml 解码类型转换

带有泛型列表的 Java 引用赋值

mysql - 需要将 SQL 列从 varchar(255) 转换为 bigint(20)

php - 砖石般的图片网格