0

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

4

2 回答 2

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”(没有国家代码)。同样,您对此无能为力,只能选择随机数来填补空白。我想如果您真的很有野心,您可以查看 3rd 方服务,尝试根据城市/州值获取区号。但如果没有,您可以先从右到左解析,然后再决定如何处理空白。例如,假设“5555555”实际上是“555-5555”,没有国家或地区代码。

于 2013-11-05T02:21:54.090 回答
0

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

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

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

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

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

或者

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

于 2013-11-05T02:04:21.237 回答