2012-02-16 7 views
0

私は大量のデータを含む大きな2列のcsvファイル( "data.csv")を持っています。 列1 列2が文字列を持っているUNIXタイムスタンプを持っていますunixタイムスタンプ付きのCSVファイルを7つの異なるCSVファイルに分割します

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

PHPを経由して、私は7つのファイル、Sunday.csv、Monday.csvにdata.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)でありますta.csv、上記の構文が間違っていると仮定して 2)私は少しPHPのレイメンを認めます:)

...どのくらい離れていますか?私は野球場でさえありますか?

+0

の可能重複する[phpでcsvファイルからデータを抽出する方法](http://stackoverflow.com/質問/ 2805427/csv-file-in-phpからのデータ抽出方法 – Gordon

+0

[fgetcsv](http://php.net/manual/en/function.fgetcsv.php)という特別な関数があります。あなたのために便利になるかもしれないʘ͜ʘ – HerrSerker

答えて

0

まず、ループの前に各繰り返しでopen fileを実行しないでください。日曜日、6 - -

$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... 
} 

さて、あなたは数字0与えるであろう、date('w')を経由してフィールドに取り組むよ土曜日:

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

ユニークな結果を作る...あなたはおそらく使用する必要がありますについてin_array()のように機能し、処理されたすべての行を1つの配列に格納します。

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. 
} 

複数のファイルを1つのファイルから作成する場合は、これをお試しください。

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

+0

Waaaah!誰かがfgetCSV()を使用する代わりにCSVファイルを読み込んで爆発するたびに、elephpantが死ぬ –

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

+0

あなたはそうです。ファイル記述子を$ days配列に配置し、最後にそれらを閉じなければならなかったかもしれません。 – core1024

+0

ファイルが正常に開かれたかどうかをチェックしていません。))(@Vyktorを使用してコメントに気付くでしょう) – Vyktor

関連する問題