Пропустить столбцы при преобразовании текстового файла с разделителями табуляции в CSV PHP

Я пытаюсь преобразовать файл с разделителями табуляции в CSV. Проблема в огромном файле. 100000 с лишним записей. И я хочу только конкретные столбцы из этого файла. Файл создан не мной, а Amazon, поэтому я не могу контролировать формат.

Код, который я сделал, работает отлично. Но мне нужно игнорировать / удалить некоторые столбцы или, вернее, я хочу только несколько столбцов из этого. Как это сделать, не влияя на производительность преобразования из TXT в CSV.

$file = fopen($file_name.'.txt','w+');
fwrite($file,$report);
fclose($file);

$handle = fopen($file_name.".txt", "r");
$lines = [];
$row_count=0;
$array_count = 0;
$uid = array($user_id);
if (($handle = fopen($file_name.".txt", "r")) !== FALSE) 
{
    while (($data = fgetcsv($handle, 100000, "\t")) !== FALSE) 
    {
        if($row_count>0)
        {
            $lines[] = str_replace(",","<c>",$data);
            array_push($lines[$array_count],$user_id);
            $array_count++;
        }
        $row_count++;
    }
    fclose($handle);
}
$fp = fopen($file_name.'.csv', 'w');
foreach ($lines as $line) 
{
    fputcsv($fp, $line);
}

fclose($fp);

я использую unset удалить любой столбец. Но есть ли лучший способ? для нескольких столбцов.

2 ответа

В простейшей форме, т.е. не беспокоясь об удалении столбцов из выходных данных, это сделает простую строку чтения и строку записи, поэтому нет необходимости поддерживать какие-либо голодные массивы.

$file_name = 'tst';
if ( ($f_in = fopen($file_name.".txt", "r")) === FALSE) {
    echo 'Cannot find inpout file';
    exit;
}
if ( ($f_out = fopen($file_name.'.csv', 'w')) === FALSE ) {
    echo 'Cannot open output file';
    exit;
}

while ($data = fgetcsv($f_in, 8000, "\t")) {
    fputcsv($f_out, $data, ',', '"');
}

fclose($f_in);
fclose($f_out);

Это один из способов удаления ненужных столбцов

$file_name = 'tst';
if ( ($f_in = fopen("tst.txt", "r")) === FALSE) {
    echo 'Cannot find inpout file';
    exit;
}
if ( ($f_out = fopen($file_name.'.csv', 'w')) === FALSE ) {
    echo 'Cannot open output file';
    exit;
}

$unwanted = [26,27]; //index of unwanted columns

while ($data = fgetcsv($f_in, 8000, "\t")) {
    // remove unwanted columns
    foreach($unwanted as $i) {
        unset($data[$i]);
    }
    fputcsv($f_out, $data, ',', '"');
}

fclose($f_in);
fclose($f_out);

Я бы сделал это, проверив ключи. Например:

// columns keys you don't wanna skip
$keys = array(0, 1, 3, 4, 7, 9);
$lines = file($file_name);
$result_lines = array();
foreach ($lines as $line) {
    $tmp = array();
    $tabs = explode("\t", $line);  
    foreach($tabs as $key => $value){
        if(in_array($key, $keys)){
            $tmp[] = $value;
        }
    }
    $result_lines[] = implode(",", $tmp);
}
$finalString = implode("\n", $result_lines);
// Then write string to file

Надеюсь, поможет. Ура, Синиша

Другие вопросы по тегам