繁体   English   中英

使用解析从CSV文件创建SQL INSERT

[英]Creating a SQL INSERT from a CSV file w/ parsing

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

另一个问题是电话号码-大多数列出为“ 555 555 5555”,有些甚至未完成(“ 555 555”),还有一些为“ 5555555555”或“ 15555555555”。 我什至从哪里开始? 我做了一些谷歌搜索,并就此特定问题作了简短介绍。 我的语言不太挑剔。 但是,我对C#或PHP最熟悉。 我也可以用C ++或BASIC完成它。 我的问题确实是从哪里开始。 谢谢。

SQL栏位:fname,lname,地址,城市,州,邮政编码,电话(#-###-###-####),电子邮件

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以便将数据导入数据库,我将在中间表中进行批量插入,然后在提交到实际表之前解析该表中的字段。 如果尝试读取CSV中的每一行并在客户端中进行解析,则最终可能会占用大量内存,而且速度很慢,尽管有很多.net库可以帮助您做到这一点。 您可以搜索TheCodePlex以获得更多。

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

http://technet.microsoft.com/zh-CN/library/ms175915.aspx

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

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

要么

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

如果您想使用php路线...

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

大多数专栏看起来都很简单。 根据您的示例,唯一真正的问题列是名称和电话号码。

名称:

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

$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”,没有国家或地区代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM