2012-06-06 42 views
1

所以我有一個CSV與這個樣子行文件:添加時間戳列預先存在的CSV

126404「560-00877」,「中心帽,A級,灰色,」 877 2 34.29 0

我想添加一個時間戳列,因此它們看起來像這樣:

126404 「560-00877」, 「中心帽,A級,灰色,」 877 2 34.29 0 2005-04-06

是否有簡單的(r)php方法打開CSV文件併爲每行添加時間戳?

謝謝!

+3

簡單( r)比什麼? – salathe

回答

0

,你可以讀取文件的每一行到一個數組,和時間戳附加到每個行,當你把它寫回:

$filename="/path/to/file.txt"; 

// Backup 
if(!copy($filename, 'backup.txt')){ 
    die('Failed to backup!'); 
} 

// Store file contents in array 
$arrFile = file($filename); 

// Open file for output 
if(($fp = fopen($filename,'w')) === FALSE){ 
    die('Failed to open!'); 
} 

// Write contents, inserting $data as second line 
$currentLine = 0; 
$cntFile = count($arrFile); 
while($currentLine <= $cntFile){ 
    fwrite($fp, $arrFile[$currentLine].",".date('y-m-d').",\n"); 
    $currentLine++; 
} 

// Delete backup 
unlink('backup.txt'); 

只需修改符合date('Y-M-D'),以滿足您的需求。

+0

嗯...它似乎在寫入文件,但不會追加任何內容(日期)。有任何想法嗎? – JoeMH

+0

可能是這裏有'backup.xml'的拼寫錯誤...此外,您將整個文件讀入內存,PHP默認內存限制可能太長。爲簡單起見,可能跳過了,所以讓海報知道。 – Yuriy

+0

不,我不認爲backup.xml輸入錯誤是問題,但我仍然糾正它。你能用日期向我們展示整條線嗎?另外,試着用'date('y-m-d',$ time)'來衡量。 – dotancohen

0

這個嗎?

$data = file("file.csv",FILE_IGNORE_NEW_LINES); 
$fp = fopen("file_new.csv","w"); 
foreach((array)$data as $val) { 
    fwrite($fp,$val." ".$timestamp."\r\n"); // build the $timestamp 
} 
fclose($fp); 
+0

由於默認的PHP內存限制,一次讀取整個文件時很容易耗盡內存。爲了簡單起見,您可能只是略過了一點,所以只是讓問題海報知道。 – Yuriy

+0

是的,用戶只是要求一個簡單的方法,所以我就這樣做了。 – 2012-06-06 11:15:12

0

你可以用標準的功能得到使用fgetcsv/fputcsv裏面做解析/逃逸的工作對你最接近:

$hSrc = fopen('path/to/file.csv', 'o'); 
if ($hSrc === false) { 
    throw new Exception('Cannot open source file for reading!'); 
} 

$hDest = fopen('path/to/new.csv', 'w'); 
if ($hDest === false) { 
    throw new Exception('Cannot open destination file for writing!'); 
} 

$timestamp = date('Y-m-d'); 

// reading source file into an array line by line 
$buffer = 1000; // should be enough to accommodate the longest row 
while (($row = fgetcsv($hSrc, $buffer, ' ')) !== false) { 
    $data['timestamp'] = $timestamp; 

    // writing that modified row into a new file 
    if (fputcsv($hDest, $data, ' ') === false) { 
     throw new Exception('Failed to write a CSV row!'); 
    } 
} 

fclose($hDest); 
fclose($hSrc); 
+0

$ buffer = 1000; //應該足以容納最長的行。你永遠不會知道我的意見.. – 2012-06-06 11:16:10

+0

正確,這是我的錯,因爲我試圖提供「安全」的代碼。該參數是可選的,以加快處理速度,如果保留默認值0,則沒有限制(除了自然限制)。 – Yuriy

0

我這樣做:

<?php 
$file_path = "yourfile.txt"; 
$file = file($file_path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 
foreach ($file as $line => $content) 
{ 
    $file[$line] = $content." ".date('Y-m-d'); 
} 
$file = implode("\n",$file); 
file_put_contents($file_path, $file); 
?> 
+0

甜。這工作完美。謝謝。 – JoeMH