2012-09-05 18 views
0

我使用的PHP cron作業下載新的CSV的每個夜晚。每個csv通常大致相同,可能在一個月內一個字段是新的。我需要獲取新字段並將其附加到數據庫。我不知道如何獲得新字段的類型。我看到別人的問題與gettype(),但我不知道這是否會工作或不,因爲數據是在一個csv內,所以當他們需要浮動或整數時,他們都不是字符串?我將如何檢查類型?解析CSV的第一行,並創建一個表內的數據庫

第二個問題,是有沒有辦法來檢查,如果沒有一個表內的名字嗎?例如,如果他們添加一個名爲foo52的新字段,並且我的數據庫中有foo1到foo51,是否有一種快速搜索不存在的字段的快速方法,或者我必須爲每個字段使用select語句,並且當它錯誤時附加它?

我使用MySQL我的數據庫。

感謝您的幫助。

+0

CSV文件沒有「型」。它們只是由逗號(或其他字符)分隔的數據串。您可以決定「12345」是一個整數還是一個看起來像整數的字符串。換句話說,如果你不知道新字段的類型是什麼,你將不得不使用text/varchar字段來保存它。 –

+0

這就是我的想法,如果我只是將所有信息存儲在數據庫中作爲文本,它真的很重要嗎? –

+0

不,不是爲了存儲。但後來如果你真的要在數據庫中使用這些數據,最好將新的字段轉換爲適當的類型。更容易在所有新的領域數據唾手可得,然後在數據庫中挑選它,以決定它是文本,數字等... –

回答

0

關於獲取類型是簡單地嘗試數據本身的轉換,然後看是否該數據相當於擁有了一條==比較部分的第一個問題。

所以,

some,data,is,123 

在數據讀取之後,您可以嘗試轉換爲各種類型,如字符串,整數,等...然後,你能確定數據的類型。

對於第二個問題,你可以通過執行獲得列名:

show columns from db.table_name 

然後,你可以做一個簡單的in_array以測試新的列名已在數據庫中。

編輯:

使用array_diff可以簡化從CSV缺少/新列名的發現。

csv_names = get_csv_column_names(); 
sql_names = get_sql_column_names(); 

new_names = array_diff(csv_names, sql_names); 
+0

我需要一個for循環並對csv中的每個列名進行'in_array'檢查嗎? –

+0

您可以執行的操作是將CSV頂部的列名讀入數組中,然後從數據庫中獲取列名,並使用'array_diff'來查找不同的列名。 – sean

0

我已經找到了parsecsv-for-php庫[重|德]非常方便的構建CSV數據。

+0

該鏈接可能有助於其他人,但我更喜歡[fgetcsv](http://md.php.net/manual/en/function.fgetcsv.php)方法。如果真的很重要,我只需要知道如何獲得類型。並回答我的第二個問題。謝謝 –

0

對於第一個問題:您可以使用is_numeric()測試它是否爲數字。如果不是,則存儲爲字符串。如果是,請在數據庫中將該字段創建爲數字。如果你願意,你可以使用正則表達式來檢查它是否是你想要正確存儲的日期或其他數據類型(即不是默認文本)

第二個問題:獲取表中的字段名Postgres完成與follwoing查詢

$sql = "SELECT attname FROM pg_catalog.pg_attribute 
        WHERE attrelid = 
         (SELECT c.oid FROM pg_catalog.pg_class c LEFT JOIN pg_namespace n ON n.oid = c.relnamespace 
          WHERE c.relname = '$this->tableName' AND n.nspname = 'public') 
         AND attnum > 0 
         AND NOT attisdropped"; 

對於MySQL,應該可以通過「顯示來自db.table_name的列」來實現。

一旦你的領域,使用in_array()來檢查,如果它已經存在......

需要注意的是:你可能需要檢查所有列在您的CSV如果它們已經存在。如果不是,請爲它添加一個新的列。如果是的話,把它作爲是...

+0

我應該提到我使用MySQL,但謝謝。對於mysql, –

+0

,同樣的推理起作用。但我也加入了答案... – user410932

+0

如果前幾行是數字,那麼它會更改爲.csv中更遠的文本? –

相關問題