Пропустить столбцы при преобразовании текстового файла с разделителями табуляции в 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
Надеюсь, поможет. Ура, Синиша