2012-03-01 54 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