从解析的CSV文件创建SQL INSERT

时间:2013-11-05 01:44:32

标签: c# php c++ sql csv

我想用我拥有的大型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”

2 个答案:

答案 0 :(得分:0)

假设您要解析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

答案 1 :(得分:0)

如果你想去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”(无国家代码)。再说一次,你没有太多可以做的,只是选择随机数来填补空白。我想如果你真的有野心,你可以查看第三方服务,尝试根据城市/州的价值来获取区号。但如果没有,你可以先从右到左解析,然后再决定怎么处理空白。例如,假设“5555555”实际上是“555-5555”,没有国家或地区代码。