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

时间:2016-08-04 21:59:44

标签: php mysql casting

因此,除了PHP不是多线程的事实之外,我还有很多困难,实际上这可能是现在唯一发生的好事。

最近我公司改为新数据库。使用我们的旧数据库,我们通过使用一个非常老的Python程序来更新我们的mysql记录(不要问为什么我们有一个数据库PLUS mysql)。现在实现了新的数据库,我有机会完全取消Python,我决定使用PHP来翻译新数据库中的信息。

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

截至目前,我并不太担心速度。在这个脚本中有很多测试对我来说,精炼它可以在以后进行。引起我问题的部分(即 TLDR )是某些字段没有更新,我花了很多时间来弄清楚原因。

我有几个Price字段设置为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中的字段转换为浮点数,我尝试了一种非常简单的方法......但这似乎不起作用。就像一样。

SO。建议吗?我错过了什么吗?我输错了吗?我吠叫错了树吗?是的,我意识到这是一个巨大的插入。它被插入的表就像临时表一样,但它永远不会被删除。

编辑:尝试放入表格的数据示例。这个(“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,试图查看它们是否会将其转到我希望它们到达的表格中。通过这样做,我意识到该字段实际上包括带有数字的引号,即使引号不在文件中。因此,看起来这些字段中的某些字段可能会为它们添加值,而这些值并非始终存在。我将尝试创建一个提取,也可以解决这个问题。

1 个答案:

答案 0 :(得分:1)

我已经弄清楚我的程序出了什么问题,虽然它不是我原先想到的,也就是说有些东西我不知道。

因为某些字段包含逗号,所以它们被转换为字符串,并且当我将它从excel文件转换为制表符分隔的文本文件时,将字面上的引号添加到数据中。所以看起来像2,323的价值变成了#34; 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.这显然非常不合适。

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

换句话说......标点符号。字面标点符号。