2013-11-05 67 views
0

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

另一个问题是电话号码 - 大多数被列为“555 555 5555”,有些甚至没有完成(“555 555”),有些是“5555555555”或“15555555555”。我甚至从哪里开始?我做了一些谷歌搜索,并就这个具体问题做了简短的介绍。我的语言不挑剔。不过,我最熟悉C#或PHP。我也可以用C++或BASIC完成它。我的问题实际上是从哪里开始的。谢谢。

SQL字段:FNAME,LNAME,地址,城市,州,邮编,电话(#### - ### - ####),电子邮件

CSV例如: “约翰·多伊中号” ,“156 Blue St”,“Nashville”,“TN”,“23434”,“(555)555-5555”,“[email protected]

CSV示例2:“John Doe”,“156 Blue St“,”Nashville“,”TN“,”23434“,”555 555-5555“,”[email protected]

CSV示例3:”John & Jill Doe“,”156 Blue St“纳什维尔“,”TN“,”23434“,”5555555555“,”[email protected]

+0

发布csv的一些真实示例条目(涵盖您的各种场景),并发布数据库表结构,以及您如何期望数据(在各种情况下)出现在那里。另外,你有什么尝试? –

+0

我编辑以反映您所说的话。不过,我还没有开始。我在问从哪里开始(参考,例子等) –

回答

0

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

下面是关于如何使用批量插入

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

要插入表格解析成真正的表,你可以使用C#或T-SQL的链接。您只需根据您的规则循环并解析每个字段。可能有数百万种方法可以做到这一点。我会开始试验。你可能会考虑使用正则表达式:

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

或者

解析数字串(或这样的事情 - 我的谷歌搜索是C#解析字符串) http://msdn.microsoft.com/en-us/library/xbtzcc4w.aspx

0

如果你想要去的php路由...

你可以使用fgetcsv解析文件一行一段时间(看文档的例子,它显示了打开f ile和循环每一行)。

大多数列看起来像一个简单的事情。根据你的例子,唯一真正的问题列是姓名和电话号码。

名称:

一种方式来获得姓氏和名字,而忽视中间的初始或其他任何东西是这样的:

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

此不考虑你的“约翰·吉尔& Doe“的例子(会给你”John“和”Doe“),但是你将不得不在某处画线......太过随意了。例如,“约翰·吉尔李四”,“约翰·H·吉尔& M.李四”等。

电话号码:处理这个是刚刚从中剥离所有非数字

最简单的方法:

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

然后,你可以格式化你想要的。在那个笔记上..你提到的人没有输入足够的数字,例如“555-5555”(没有国家/地区代码)或“555-555-555”(没有国家代码)。再说一次,关于这一点你可以做的不多,只是选择随机数来填补空白。我想如果你感觉真的很有雄心壮志,你可以看看第三方服务,试图根据城市/州的价值获得区号。但是,如果没有,你可以从右到左解析,然后决定如何处理空白。例如,假设“5555555”确实是“555-5555”,没有国家或地区代码。