2012-02-16 17 views
0

我有一個大的2列csv文件(「data.csv」)與數週的數據。 列一個Unix的時間戳 列中有兩個具有字符串:將具有unix時間戳的CSV文件拆分爲7個不同的csv文件

1329548400,cats 
1329548400,dogs 
1329550200,fish 
1329550200,cats 
1329552000,dogs 
1329552000,fish 
1329584400,cats 
1329584400,dogs 
1329550200,cats 

通過PHP,我需要data.csv轉換爲7個檔,Sunday.csv,Monday.csv ... Saturday.csv

如果我能抓住每一行,我知道我可以做這樣的事情

$temp = "data.csv"; 
$fileName = array_unique($temp); 
foreach ($fileName as $row) { 
    $theDay = date("Y", $row[firstcolumn]); 
    if ($theDay == "Sunday") { 
     $fileToWriteTo = "Sunday.csv"; 
     $f = fopen($fileToWriteTo, "a"); 
     fwrite($fileToWriteTo, $row . "\n"); 
     fclose($fileToWriteTo); 
     } 
    if ($theDay == "Monday") { 
     $fileToWriteTo = "Monday.csv"; 
     $f = fopen($fileToWriteTo, "a"); 
     fwrite($fileToWriteTo, $row . "\n"); 
     fclose($fileToWriteTo); 
     } 
    } 

問題是

1)我不知道如何讀DA的每一行ta.csv,假設上面的語法是錯誤的 2)我承認我的一個PHP門外漢:)

...我有多遠?我甚至在大球場?

+0

可能重複[如何提取的PHP csv文件數據(http://stackoverflow.com/問題/ 2805427/how-to-extract-data-from-csv-file-in-php) – Gordon 2012-02-16 14:54:24

+0

有一個特殊的函數[fgetcsv](http://php.net/manual/en/function.fgetcsv.php)這可能會派上用場ʘ͜ʘ – HerrSerker 2012-02-16 14:58:35

回答

0

首先,在每次迭代時不要open file在循環之前做。現在

$fps = array(); // fps = File Pointers 
$days = array('Sunday', 'Monday', 'Tuesday', ...); 
foreach($days as $key => $name){ 
    $fps[ $name] = fopen('a', $name . '.csv'); 
    if(!$fps[ $name]){ 
     die("Cannot open $name.csv"); 
    } 

    // Although I wouldn't rely on date's `l` format, because 
    // it can be localized and script may just stop working 
    // and rather use: 
    $fps[ $key] = fopen('a', $name . '.csv'); 
    if($fps[ $key])... 
    // Sunday = 7 = 0, Monday = 1... 
} 

,你會通過date('w')地址字段,這將給數字0 - 週日,6 - 星期六:

$day = date('w', $timestamp); 

關於製作獨特的結果...你可能需要使用功能如in_array(),並將所有處理過的行存儲在一個數組中。

關於讀取和寫入CSV文件,有2個功能:fgetcsv() resp。 fputcsv()。所以整個循環:

$temp = "data.csv"; 
$rows = array(); // List of unique itemps 
$fp = fopen($temp, 'r') or die("Cannot open `$temp` for reading"); 
// Put here loop which will open all 7 files as mentioned above 
// Optionally skip first row (it may contain header) 
fgets($fp); 

// Read each row 
while(($array = fgetcsv($fp, 10000, ',', '"') !== false){ 
    // Check unique row 
    $row = implode(',', $array); 
    if(in_array($row, $rows)){ 
     continue; // Skip this iteration 
    } 
    $rows[] = $row; 

    $day = date('w', $array[0]); 
    fputcsv($fps[$day], $array); 
} 

而且不要忘了close所有文件:

fclose($fp); 
foreach($fps as $fp){ 
    fclose($fp); 
} 
0

如果您正在從文件中讀取數據,則需要創建一個句柄來讀取該文件,然後獲取每行並進行解析。

$handle = fopen('data.csv','r'); 
while($line = fgets($handle)){ 
    //Do any parsing here. 
    $array = explode(',',$line); 
    $timestamp = $array[0]; 
    $string = $array[1]; 
    //Do whatever else you need to do with it. 
} 

如果您想從一個文件創建更多文件,請嘗試閱讀本文。

http://php.net/manual/en/function.fopen.php

+0

Waaaah!每次有人讀取並爆炸一個CSV文件而不是使用fgetCSV()時,一個elephpant會死亡 – 2012-02-16 15:14:41

0

也許這將做的工作。我沒有測試過它。

$temp = "data.csv"; 
$fileData = file($temp); 
$errors = 0; 
$days = Array(fopen('Sunday.csv','a+'), 
       fopen('Monday.csv','a+'), 
       fopen('Tuesday.csv','a+'), 
       fopen('Wednesday.csv','a+'), 
       fopen('Thursday.csv','a+'), 
       fopen('Friday.csv','a+'), 
       fopen('Saturday.csv','a+')); 
foreach($days as $fd) $errors += ($fd === FALSE); 
if(! $errors) 
{ 
    foreach ($fileData as $row) { 
     $columns=explode(',',$row); 
     $theDay = date("w", $columns[0]); 
     if(empty($days[$theDay])) continue; // maybe not valid date 
     fwrite($days[$theDay], $row."\n"); 
    } 
} 
else 
{ 
    echo "I couldn't open $errors of the files\n"; 
} 
foreach($days as $fd) if($fd !== FALSE) fclose($fd); 
+0

是的,在每次迭代中打開和關閉文件,路要走! * * :) – Vyktor 2012-02-16 15:01:34

+0

你說得對。也許我必須將文件描述符放在$ days數組中並在最後關閉它們。 – core1024 2012-02-16 15:02:53

+0

不檢查文件是否成功打開。))(使用@Vyktor,所以我會得到有關評論的通知) – Vyktor 2012-02-16 15:09:50

相關問題