2013-01-25 116 views
1

我正在將CSV文件導入數據庫,這是一個多步驟的過程。PHP CSV導入問題

步驟如下:

  • 步驟1:用戶上傳CSV文件。
  • 第2步:用戶將數據關聯到數據類型。例如,如果CSV中的記錄包含以下數據:John,Doe,[email protected],則用戶將從下拉框中選擇名字以與數據值John關聯,與關聯到數據值Doe的下拉框關聯的姓氏以及來自某個數據值的電子郵件地址下拉框,聯營的數據值[email protected]
  • 步驟3:將數據插入數據庫

我的問題有以下幾點:

1 /第3步,我會在我擁有用戶選擇的列和原始數據。

這裏是原來的數據是這樣的:

$data = array(
0 => array('John','Doe','[email protected]'), 
1 => array('Foo','Bar','[email protected]') 
); 

這裏就是我的列從第2步選擇的樣子:

$columns = array('firstname','lastname','emailaddress') 

如何創建一個SQL查詢,可像下面這樣:

INSERT into contacts (id,firstname,lastname,emailaddress) values (null,'John','Doe','[email protected]')

正如你所看到的,sql查詢具有按照它們在數組中的順序選擇的列,然後是值。我在想,既然列是按照數據的順序選擇的,我可以假設數據的順序是正確的,並與該位置的特定列相關聯(例如,我可以假設數據值' John'與列數組的第一個位置關聯,反之亦然)。

2. /我在考慮一種可能的情況,即當用戶進行文件的初始上傳時,他們可能會發送一個csv文件,其中第一個記錄具有空白字段。問題是,我根據csv記錄中的列數來確定用戶與數據關聯的列數。在這種情況下,我們有2列,每個後續記錄有3列。那麼,我不打算遍歷整組記錄來確定正確的列數。我該如何解決這個問題?有任何想法嗎?

編輯

我想我找到了答案回答問題2 CSV文件的解析,我可以爲每個記錄,並在解析結束最高計數的計數是我的計數。好像?有什麼問題呢?

+1

我沒有談及你的第二個問題,但你的解決方案是我想要的。僞代碼:如果numFieldsCurrLine> maxFieldsSeen,則maxFieldsSeen = numFieldsCurrLine; –

回答

1

要解析CSV文件中的數據,請查看fgetcsv。 http://php.net/manual/en/function.fgetcsv.php

它會從文件中加載一行並返回一個CSV字段的數組。

$data = array(); 
while (($lineFields = fgetcsv($handle)) !== false) { 
    $data[] = $lineFields; 
} 

這裏假設您使用的是PHP5並使用$ handle打開文件。在PHP4中,fgetcsv需要第二個參數來讀取最大長度的行。

對於查詢:

$sql = "INSERT into contacts (id," + implode(',', $columns) + ") values"; 

我不包括值之後任何事情。您應該創建準備好的語句來防止sql注入。另外如果你使用的是MySQL,id應該是一個自動增量字段,並且從插入中省略(讓MySQL生成它)。如果您正在使用Postgres,則需要爲id字段創建一個序列。無論如何,讓數據庫爲你生成id。

+0

感謝您的回答和評論。正是我所期待的。 – jkushner