【问题标题】:To use CSV or XML for data imports?使用 CSV 或 XML 进行数据导入?
【发布时间】:2011-11-18 03:49:26
【问题描述】:

如果我希望能够将数据导入数据库表,我正在编写一个脚本。该表是 mysql、SQLite 3 或 PostgreSQL。假设它可能是大量数据(数据是电子商务软件的产品/类别/描述等)。

保存此类数据的最佳(最快和更普遍使用的)格式是什么?导入数据的最佳方式是什么?

我做了一些研究,但这只是让这个问题变得更难了。例如,有人说 csv 更好,因为它更小,有人说 xml 更差,因为没有一个标准.. 有人说 xml 更好,因为数据更容易处理。

想法?我也对其他格式持开放态度。如果有区别的话,软件是用 php 编写的。

【问题讨论】:

  • 我从未听说过告诉 MySQL 导入 XML 的方法。但是每个人都了解 CSV。似乎 CSV 在这里是显而易见的。
  • 嗯,这是个人喜好的问题,这基本上取决于您想要对数据进行什么处理。你能指定什么吗?
  • CSV 也没有真正的单一标准。我在野外看到了许多不同的风格(如果你的数据有内部换行符,事情就会变得棘手)。
  • 我知道 csv 也没有标准(尽管它被命名为逗号分隔值),但似乎很容易将正在使用的分隔符等传递给函数。这就是为什么我认为它更容易。

标签: php xml csv tabular


【解决方案1】:

我几乎总是使用 CSV 在 SQL 之外存储数据。它增加的唯一真正的复杂性是记住要正确地逃避一切!

额外的好处是大多数电子表格软件都可以很好地读取它。

【讨论】:

  • +1 适用于大多数电子表格软件。至少到 2002 年,XML 基本上不受支持。
  • 只需使用一个像样的库来创建 CSV;不要尝试使用字符串手动构建它。
  • 关于电子表格软件打开csv的话题,OpenOffice直接打开没有问题。 Excel for Mac 真的不想打开它。它可以毫无问题地导入数据,但没有运气打开和保存。任何人在 Mac 上的任何想法?
【解决方案2】:

我认为最好利用每个数据库导出/导入功能并为它们使用推荐的格式。例如,对于 MySQL,您可以使用 LOAD DATE INFILE

“LOAD DATA INFILE 语句以非常高的速度将文本文件中的行读取到表中。文件名必须以文字字符串的形式给出。”

是的,如果您需要一种格式,我也建议使用 CSV,因为我使用过它并且非常便携,易于更改和阅读,并且也同意 @Chris G。

【讨论】:

  • 我不同意 CSV 文件易于阅读的说法:我发现很难在视觉上将值与其标题联系起来——除非您使用 Excel 之类的软件来查看它 [注意:如果您有CSV 文件中的日期,Excel 将其格式更改为其中包含逗号的格式,这将产生来自LOAD] 的错误。但是,我同意 CSV 是更好的选择。
【解决方案3】:

我认为 CSV 和 XML 有不同的用途:

  • 为了存储原始表数据,csv 是一个非常精确的表表示(就是它:列和行)。因此,它易于操作,但不允许您重现关系,如果需要数据一致性,这可能是个问题
  • 对于序列化实体或对象,XML 是可行的方法:它提供了树形结构并且可读性很强。 XML有一些优点:你可以使用DTDs或XSDs来验证数据,它的树形结构可以用来保持数据的一致性......

mysql最新版本支持XML导入:http://dev.mysql.com/doc/refman/5.5/en/load-xml.html

【讨论】:

    【解决方案4】:

    欢迎你接受我的想法。我花了两天时间阅读有关 XML 序列化的 .NET 文献。我认为它更具可读性,并且经验对我有利,尤其是在参考 SOAP 时。如果你有很多数据,它肯定比 CSV 更具可读性。也许是我、.NET 或我的 XML Schema 定义(或愿望?),但我很遗憾没有使用标准流/序列化机制编写 XML 并放弃框架的额外功能。这两天我学到的只是 XML Schema 和一些我还无法控制的 .NET 框架。

    您确实为 XML 添加了类型安全性,但我会质疑它对于未提供元素的默认值是否灵活

    【讨论】:

      【解决方案5】:

      你自己回答了大部分。所有的方法都有它的优点和缺点。

      首先我有一个建议,尝试在您的应用程序中创建一个 API,让您可以轻松更改您提供的格式。如果您对 MVC 架构有一定的经验,请将 XML 或 CSV 输出仅视为一个视图。如果您创建的界面可以让您轻松填写其他模板,那么您在需要其他格式的情况下会更加灵活。

      最终,处理这两种格式将非常相似。处理标准化的 XML 需要更多的练习,而且有时会很棘手。例如,使用像UBL 2.0 这样的标准(我在电子商务解决方案中看到的很常见的东西)将为您提供一个强大的解决方案,但扩展它是一件令人头疼的事情,除非您精通 XML 及其模式。但是,您将使用一种记录在案的语言。

      如果您选择您定义的导出的任意格式/布局,并且客户/供应商/任何其他第三方都必须实施它,那么您选择什么并不重要,解析或构建它们所需的时间是大致相同。

      【讨论】:

      • API 是什么意思?当它进行恢复时,它只是调用 restore() 函数。我希望将来可以对其进行编辑以检查 $_FILES[$file] 是 csv 文件的 zip 文件还是 xml。但现在,只有一个是重要的。这就是我使用 API 的意思吗?
      【解决方案6】:

      csv 更容易使用,而 xml 更漂亮,从我的角度来看,开销更大

      【讨论】:

        【解决方案7】:

        虽然非常规,但我会使用 JSON - 有点像这样......

        // select your data
        $result = mysql_query("SELECT * FROM some_table;");
        
        // build an associative array for each row, and add to total data
        while($row = mysql_fetch_assoc($result)){
          $rows[] = $row;
        }
        
        // encode it all as JSON
        $data = json_encode( $rows );  
        

        它的优点是数据在编码之前作为一个非常容易操作的对象(在我的示例中为$rows)存储在 php 中,并且可以传递给几乎任何语言进行进一步处理。

        如果你担心数据的大小,那么你可以压缩它,因为它是重复的,它压缩得很好。

        此方法处理所有转义,并提供一种编码/解码数据的方法,而无需构建用于重新附加列标题等的自定义函数...

        这不是最有效的方法,也不会产生最简洁的格式,但它具有高度的可移植性,并且可以非常容易地处理......就像这样:

          // convert JSON string into php object
          // then loop over it to operate on each row
          foreach(json_decode($data) as $row){
            // create empty array for keys and vals
            $vals = $keys = array();
            // create array of keys and vals in the data row
            foreach($row as $k => $v){
              $keys[] = $k; $vals[] = $v;
            }
            // build an insert statement using the keys and values from each row
            echo "INSERT INTO some_table (".implode(',',$keys).") VALUES (".implode(',',$vals).");\n";   
          }
        

        虽然它不是最有效的,但我喜欢这种处理数据的方式,而且我觉得它更不容易出错,因为数据的结构和数据从不分离。

        我怀疑很多人会同意这一点,因为编码和解码 JSON 的开销意味着它与 CSV 相比表现不佳,尽管可能比 XML 更好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-21
          • 1970-01-01
          • 1970-01-01
          • 2018-07-18
          • 2021-10-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多