2012-03-01 65 views
1

我最近为我们的一位员工编写了邮件平台以供使用。系统运行良好,规模很大,使用起来很有趣。然而,由于我无法弄清楚如何修复(相当缺乏经验的开发人员),所以它目前无法运行。错误格式化时解析CSV以插入数据库

的过程是这样的......

  1. 上传CSV文件到一个特定的FTP目录。
  2. 转至import_mailing_list页面。
  3. 在FTP目录中选择一个CSV文件。
  4. 名称并描述该列表包含的内容。
  5. 将文件标题与数据库列相关联。

然后,后端循环遍历文件的每一行,将值与标题相关联,并将这些值导入到数据库中。

这一切都奇妙地工作,除了在特定情况下,当原始CSV格式不正确时。例如...

fname, lname, email 
Bob, Schlumberger, [email protected] 
Bobbette, Schlumberger 
Another, Record, [email protected] 

正如你所看到的,第二行有一个缺失的逗号。这会在尝试拉取“valArray [3]”(或valArray [2],除了我的每种语言)的情况下导致错误。

我正在寻找最有效的解决方案来防止发生此错误。也许我应该检查数组长度,并将其与我们将尝试拉动的索引进行比较,然后再拉动它。但是为每个价值做到这一点似乎效率低下。任何人有另一个想法?

我们的堆栈是ColdFusion 8/9和MySQL 5.1。这就是为什么我将数组索引称为[3]。

回答

5

ArrayIsDefined(array, elementIndex),或ArrayLen(array)

似乎效率不高?

你必须编码你需要的代码,忘记了效率低下。在快速获得之前就做好准备(需要时)。

+1

谢谢。我将使用你给出的第一个例子作为条件。关于使其工作,你提出了一个非常好的观点。我很感激你的意见,我一定会在将来记住它! – TaylorPLM 2012-03-01 19:02:48

1

我想如果你正在寻找另一种方式来做到这一点(而不是每次检查数组的长度,虽然这听起来对我来说听起来不那么糟糕),你可以将每一行插入尝试包装在try/catch块。如果失败,则将失败的行填入缓冲区(包括行号和错误消息),然后可以在批次完成后显示给用户,以便他们可以查看每条失败的行以及失败的原因。这具有以下优点:1)不必每次都明确检查数组长度,2)捕获其他您可能事先没有预料到的错误(例如,对于您的字段,值可能太长)。

+0

感谢您试图为我提供另一种解决方案!我相信在写入数组长度检查之后,我将能够使用数组长度检查和索引列表或其他方法来找出更有效的方法,因此每个记录只需要进行一次检查。 – TaylorPLM 2012-03-01 19:11:46

+1

没错,这很好,但就像我提到的那样,会比我的方法稍微慢一些。我的解决方案只是假定它可以工作(对于大多数情况来说,开销较小),但是当它没有时会处理它(它可以处理的错误类型具有更大的灵活性)。我认为这更类似于你在原始问题中要求的内容,但这取决于你。 – 2012-03-01 19:18:14