要使用CSV或XML进行数据导入?

时间:2011-09-15 19:01:51

标签: php xml csv tabular

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

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

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

思考?我也对其他格式持开放态度。如果有所不同,该软件是用PHP编写的。

7 个答案:

答案 0 :(得分:7)

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

额外的好处是,大多数电子表格软件都可以正常阅读。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

欢迎你的想法。我花了两天时间阅读关于XML序列化的.NET文献。我认为它更具可读性,而且经验对我有好处,特别是在参考SOAP方面。如果你有很多数据,它肯定比CSV更具可读性。也许是我,.NET,或者我的XML Schema定义(或者是欲望?)但是我很遗憾没有使用标准的流/序列化机制编写XML并且超出了框架的额外功能。我在过去两天学到的只是XML Schema和一些我无法控制的.NET框架。

您确实已经使用XML添加了类型安全性,但我会质疑它对于不匹配元素的默认值是否灵活

答案 4 :(得分:0)

你最适合回答自己。所有这些方法都有其优点和缺点。

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

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

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

答案 5 :(得分:0)

csv更容易使用,而xml更高级,从我的观点来看,带来更多的开销

答案 6 :(得分:0)

虽然非常规,但我会使用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更好。