2010-03-16 85 views
1

我有一個CSV文件。第一行將始終包含列標題。根據各種因素,列的順序可能會發生變化,並且在極少數情況下,某些列可能不存在。這些變化超出了我的控制範圍。導入CSV文件時按列順序處理更改

到目前爲止,我的想法是關於如何解決這個問題。我將讀取文件的第一行並使用這些值生成源文件中包含的列的列表。目標文件將使用與源相同的列名稱。這應該與在源和目的地中搜索相同的名稱一樣簡單,然後僅映射列索引值,對嗎?

您對此有何建議?

+0

你想用CSV文件做什麼?你只是簡單地將文件轉換成一個具有特定順序的列?你打算爲缺失的列插入空白值嗎?你究竟想要完成什麼? – 2010-03-16 16:08:38

+0

是的,這是一個簡單的轉換。如果該列在源文件中不存在,則它將在目標中爲空。 – DenaliHardtail 2010-03-16 16:22:30

回答

0

我這樣做了一次,通過構建我期望在那裏的列的名稱的哈希映射到實際存在的列標題的索引(或實際列名稱)。我首先通過構建包含我期望的所有列名稱作爲關鍵字和一些值(如-1)作爲值的地圖來完成此任務。然後我得到了列標題數組。對於映射中所有鍵的循環以及文件中存在的所有標題,嵌套循環都經過了循環,我在刪除空格後做了不區分大小寫的比較,如果匹配,我將列的索引作爲值爲地圖中的那個鍵。然後,在構建目標文件時,我只需循環顯示CSV中每一行的映射中的鍵,並從映射中指定的索引獲取數據,然後根據數據執行任何操作,而忽略列地圖中的值爲-1。我是用Java做的,但我想它在C#中幾乎完全相同。

-1

如果我打算這樣做,我會使用SQL和DAO。有2個技巧。第一個是建立到Excel工作表的連接,如果它是一個數據庫表(您將需要DAO 3.6對象庫作爲VBA參考),

Dim dbtmp As dao.Database 
Dim qd As dao.QueryDef 

Set dbtmp = OpenDatabase(mPath & "\" & mName, False, True, "Excel 8.0;") 
Set qd = dbtmp.CreateQueryDef("", " THE QUERY ") 
qd.Execute 

,第二個是要建立作爲數據源的CSV文件連接。的該格式是一樣的東西:

mQuery = "SELECT * FROM [Text;HDR=NO;CharacterSet=437;DATABASE=" 
mQuery = mQuery & mpath 
mQuery = mQuery & "]." 
mQuery = mQuery & mfile 
mQuery = mQuery & ";" 

你將不得不使用代碼來構建SQL,你需要建立在對的資源文件的字段,以及要構建INSERT INTO查詢。使用名稱創建對源數據的選擇查詢可能最簡單,然後在插入到查詢中時使用它。

這樣做的好處是SQL將處理源數據中缺失的字段,而且對列的顯示順序不會太挑剔。您可以通過將csv作爲文本文件打開來獲取標題。