【问题标题】:Importing CSV with odd rows into MySQL将具有奇数行的 CSV 导入 MySQL
【发布时间】:2013-10-28 23:02:33
【问题描述】:

我遇到了一个有问题的 CSV 文件,我必须将其导入 MySQL。
要么通过使用 PHP 然后插入命令,要么直接通过 MySQL 的 load data infile。

我附上了文件中数据外观的部分屏幕截图:

我需要插入的值低于“ACC1000”,所以我必须从第 5 行开始,并通过大约 5500 行的文件。

无法跳到下一行,因为对于某些帐户,有多个付款,如下所示。

我一直试图通过扫描行以查找“ACC”的出现来到达下一行

if (strpos($data[$c], 'ACC') !== FALSE){
    echo "Yep ";
} else {
    echo "Nope ";
}

我知道这很粗糙,但我真的不知道从哪里开始。

【问题讨论】:

  • 因此,使用这段代码:Read lines 和一个计数器,您可以根据需要读取这些行

标签: php mysql fgetcsv


【解决方案1】:

如果您在目标表中定义了一个(外键)约束,这样type 列中具有空白值的记录将被拒​​绝,您可以使用 MySQL 的LOAD DATA INFILE 将第一列读入用户变量(被结转到后续记录)并应用其IGNORE 关键字来跳过那些未通过 FK 约束的“记录”:

LOAD DATA INFILE '/path/to/file.csv'
    IGNORE
    INTO TABLE my_table
    CHARACTER SET utf8
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES  TERMINATED BY '\r\n'
    IGNORE 4 LINES
    (@a, type, date, terms, due_date, class, aging, balance)
    SET account_no = @account_no := IF(@a='', @account_no, @a)

【讨论】:

  • “my_table”出现错误,语法错误意外 IDENT_QUOTED,期待 TABLE_SYM
  • 我刚刚将它粘贴到 mysql 工作台中,将 my_table 替换为我的名字,并且表名带有该错误的下划线
  • ar_balance 是表名
  • 我的错。应该是INTO TABLE my_table
  • 好的,解决了错误,但现在出现“错误代码:13。无法获取'/var/lib/mysql/dailypricing/balance.csv'的统计信息”(错误代码:2 )”,我可以从那个目录加载文件,我把它改成 0777,我还能尝试什么?
【解决方案2】:

您可以采取多种方法。

1) 您可以使用@Jorge Campos 的建议并逐行读取文件,使用 PHP 代码跳过您不需要的行并将您想要的行插入 MySQL。如果您有一个非常大的文件,这种方法的一个潜在缺点是您要么必须运行一堆小查询,要么构建一个更大的查询,并且可能需要一些时间来运行。

2) 您可以处理文件并删除您不需要的任何行/列,将文件保留为可以通过命令行或其他方式直接插入 mysql 的格式。

根据您决定采用的方法,如果您需要,我自己或社区都可以提供代码示例。

【讨论】:

    【解决方案3】:

    这个 sn-p 应该让你朝着正确的方向前进:

    $file = '/path/to/something.csv';
    
    if( ! fopen($file, 'r') ) { die('bad file'); }
    
    if( ! $headers = fgetcsv($fh) ) { die('bad data'); }
    
    while($line = fgetcsv($fh)) {
      echo var_export($line, true) . "\n";
      if( preg_match('/^ACC/', $line[0] ) { echo "record begin\n"; }
    }
    
    fclose($fh);
    

    http://php.net/manual/en/function.fgetcsv.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 2011-03-19
      • 2013-12-21
      • 2015-02-07
      • 1970-01-01
      相关资源
      最近更新 更多