Разделить CSV-файл с временными метками Unix на 7 разных CSV-файлов - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть большой 2-колоночный CSV-файл ("data.csv") с данными за несколько недель.В первом столбце есть метки времени Unix. Во втором столбце есть строки:

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) Я не знаю, как прочитать каждую строку в data.csv, предполагая, что приведенный выше синтаксис неверен 2) Я признаю, что я немного из php мирянин:)

... как далеко я?Я вообще на стадионе?

Ответы [ 3 ]

0 голосов
/ 16 февраля 2012

Может быть, это сделает работу. Я не проверял это.

$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 голосов
/ 16 февраля 2012

Во-первых, не открывайте файл на каждой итерации, делайте это перед циклом.

$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() соответственно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);
}

И не забудьте закрыть все файлы:

fclose( $fp);
foreach( $fps as $fp){
    fclose( $fp);
}
0 голосов
/ 16 февраля 2012

Если вы читаете из файла, вам нужно создать дескриптор, чтобы прочитать этот файл, а затем получить каждую строку и затем проанализировать.

$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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...