【问题标题】:Creating a SQL INSERT from a CSV file w/ parsing从带有解析的 CSV 文件创建 SQL INSERT
【发布时间】:2013-11-15 19:58:44
【问题描述】:

我想使用我拥有的大型 CSV 文件创建一个 SQL INSERT 查询。问题是名称没有被解析出来。它们被列为“John Doe”或“John B Doe”而不是“John”和“Doe”,因为我区分了名字和姓氏(我不关心中间名首字母)。

另一个问题是电话号码 - 大多数被列为“555 555 5555”,有些甚至没有完成(“555 555”),有些是“5555555555”或“15555555555”。我什至从哪里开始?我做了一些谷歌搜索,并在这个特定问题上出现了不足。我对语言不挑剔。但是,我最熟悉 C# 或 PHP。我也可以用 C++ 或 BASIC 完成它。我的问题,真的,是从哪里开始。谢谢。

SQL 字段:fname、lname、address、city、state、zip、phone(#-###-###-####)、email

CSV 示例:“John M Doe”、“156 Blue St”、“Nashville”、“TN”、“23434”、“(555) 555-5555”、“ex@ex.com”

CSV 示例 2:“John Doe”、“156 Blue St”、“Nashville”、“TN”、“23434”、“555 555-5555”、“ex@ex.com”

CSV 示例 3:“John & Jill Doe”、“156 Blue St”、“Nashville”、“TN”、“23434”、“5555555555”、“ex@ex.com”

【问题讨论】:

  • 发布一些 csv 的真实示例条目(涵盖您的各种场景),并发布您的数据库表结构,以及您希望数据(在各种场景中)如何出现在那里。另外,你试过什么?
  • 我进行了编辑以反映您所说的。不过,我什至还没有开始。我在问从哪里开始(参考、示例等)

标签: c# php c++ sql csv


【解决方案1】:

假设您正在解析 CSV 以将数据导入数据库,我会在中间表中进行批量插入,然后在提交到真实表之前解析该表中的字段。如果您尝试读取 CSV 中的每一行并在客户端中进行解析,您最终可能会使用大量内存并且速度会很慢,尽管有很多 .net 库可以帮助您做到这一点。您可以搜索 TheCodePlex 了解更多信息。

这里是如何使用批量插入的链接

http://technet.microsoft.com/en-us/library/ms175915.aspx

要将插入表解析为真实表,您可以使用 c# 或 t-sql。您只需要根据您的规则循环并解析每个字段。可能有数百万种方法可以做到这一点。我只是开始尝试。您可能会考虑使用 RegEx:

http://regexlib.com/?AspxAutoDetectCookieSupport=1

或者

解析数字字符串(或类似的东西——我的 Google 搜索是 c# 解析字符串) http://msdn.microsoft.com/en-us/library/xbtzcc4w.aspx

【讨论】:

    【解决方案2】:

    如果你想走php路线......

    您可以使用fgetcsv 一次解析文件一行(查看文档示例,它显示了打开文件并循环遍历每一行的示例)。

    大多数列看起来都是直截了当的。根据您的示例,唯一真正的问题列是姓名和电话号码。

    姓名:

    获取名字和姓氏并忽略中间名首字母或其他任何内容的一种方法是:

    $name = "John Smith";
    $name = explode(" ",$name);
    $fname = array_shift($name);
    $lname = array_pop($name);
    

    这不能解释您的“John & Jill Doe”示例(会给您“John”和“Doe”),但您必须在某处划清界限......那里。例如“John and Jill Doe”、“John H. & Jill M. Doe”等。

    电话号码:

    处理此问题的最简单方法是从中删除所有非数字:

    $phone = "(555) 555 555";
    $phone = preg_replace('~[^0-9]~','',$phone);
    

    然后,您可以按照自己的意愿对其进行格式化。在那张纸条上..你提到人们没有输入足够的数字,例如“555-5555”(无国家/地区代码)或“555-555-555”(无国家代码)。同样,您对此无能为力,只能选择随机数来填补空白。我想如果你真的很有野心,你可以考虑使用 3rd 方服务来尝试根据城市/州值获取区号。但如果没有,你可以从从右到左解析它然后决定如何处理空白。例如,假设“5555555”实际上是“555-5555”,没有国家或地区代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2020-04-13
      相关资源
      最近更新 更多