Как узнать, если поля CSV-файла разделены табуляцией или запятой - PullRequest
12 голосов
/ 03 августа 2010

как узнать, являются ли поля CSV-файла разделителями табуляции или запятыми.Мне нужна проверка php для этого.Может кто-нибудь, пожалуйста, помогите.Заранее спасибо.

Ответы [ 15 ]

0 голосов
/ 12 августа 2014

Это моё решение.Это работает, если вы знаете, сколько столбцов вы ожидаете.И, наконец, символ-разделитель - это $ actual_separation_character

$separator_1=",";
$separator_2=";";
$separator_3="\t";
$separator_4=":";
$separator_5="|";

$separator_1_number=0;
$separator_2_number=0;
$separator_3_number=0;
$separator_4_number=0;
$separator_5_number=0;

/* YOU NEED TO CHANGE THIS VARIABLE */
// Expected number of separation character ( 3 colums ==> 2 sepearation caharacter / row )
$expected_separation_character_number=2;  


$file = fopen("upload/filename.csv","r");
while(! feof($file)) //read file rows
{
    $row= fgets($file);

    $row_1_replace=str_replace($separator_1,"",$row);
    $row_1_length=strlen($row)-strlen($row_1_replace);

    if(($row_1_length==$expected_separation_character_number)or($expected_separation_character_number==0)){
    $separator_1_number=$separator_1_number+$row_1_length;
    }

    $row_2_replace=str_replace($separator_2,"",$row);
    $row_2_length=strlen($row)-strlen($row_2_replace);

    if(($row_2_length==$expected_separation_character_number)or($expected_separation_character_number==0)){
    $separator_2_number=$separator_2_number+$row_2_length;
    }

    $row_3_replace=str_replace($separator_3,"",$row);
    $row_3_length=strlen($row)-strlen($row_3_replace);

    if(($row_3_length==$expected_separation_character_number)or($expected_separation_character_number==0)){
    $separator_3_number=$separator_3_number+$row_3_length;
    }

    $row_4_replace=str_replace($separator_4,"",$row);
    $row_4_length=strlen($row)-strlen($row_4_replace);

    if(($row_4_length==$expected_separation_character_number)or($expected_separation_character_number==0)){
    $separator_4_number=$separator_4_number+$row_4_length;
    }

    $row_5_replace=str_replace($separator_5,"",$row);
    $row_5_length=strlen($row)-strlen($row_5_replace);

    if(($row_5_length==$expected_separation_character_number)or($expected_separation_character_number==0)){
    $separator_5_number=$separator_5_number+$row_5_length;
    }

} // while(! feof($file))  END
fclose($file);

/* THE FILE ACTUAL SEPARATOR (delimiter) CHARACTER */
/* $actual_separation_character */

if ($separator_1_number==max($separator_1_number,$separator_2_number,$separator_3_number,$separator_4_number,$separator_5_number)){$actual_separation_character=$separator_1;}
else if ($separator_2_number==max($separator_1_number,$separator_2_number,$separator_3_number,$separator_4_number,$separator_5_number)){$actual_separation_character=$separator_2;}
else if ($separator_3_number==max($separator_1_number,$separator_2_number,$separator_3_number,$separator_4_number,$separator_5_number)){$actual_separation_character=$separator_3;}
else if ($separator_4_number==max($separator_1_number,$separator_2_number,$separator_3_number,$separator_4_number,$separator_5_number)){$actual_separation_character=$separator_4;}
else if ($separator_5_number==max($separator_1_number,$separator_2_number,$separator_3_number,$separator_4_number,$separator_5_number)){$actual_separation_character=$separator_5;}
else {$actual_separation_character=";";}

/* 
if the number of columns more than what you expect, do something ...
*/

if ($expected_separation_character_number>0){
if ($separator_1_number==0 and $separator_2_number==0 and $separator_3_number==0 and $separator_4_number==0 and $separator_5_number==0){/* do something ! more columns than expected ! */}
}
0 голосов
/ 06 августа 2013

Вы также можете использовать fgetcsv (http://php.net/manual/en/function.fgetcsv.php), передав ему параметр-разделитель. Если функция возвращает false, это означает, что параметр $ delimiter был неправильным

, чтобы проверить, является лиразделитель ';'

if (($data = fgetcsv($your_csv_handler, 1000, ';')) !== false) { $csv_delimiter = ';'; }
0 голосов
/ 08 января 2012

Самый простой способ ответить на это - открыть его в текстовом редакторе или в TextMate.

0 голосов
/ 03 августа 2010

Когда я вывожу файл TSV, я создаю вкладки, используя \ t один и тот же метод, как если бы я написал разрыв строки, такой как \ n, так что, как говорится, я думаю, что метод может быть следующим:

<?php
$mysource = YOUR SOURCE HERE, file_get_contents() OR HOWEVER YOU WISH TO GET THE SOURCE;
 if(strpos($mysource, "\t") > 0){
   //We have a tab separator
 }else{
   // it might be CSV
 }
?>

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

0 голосов
/ 03 августа 2010

Помимо тривиального ответа, что c sv-файлы всегда разделены запятыми - это от имени, я не думаю, что вы можете придумать какие-то жесткие правила.Как файлы TSV, так и файлы CSV указаны достаточно свободно, поэтому вы можете создавать файлы, которые могут быть приемлемы в обоих случаях.

A\tB,C
1,2\t3

(при условии \ t == TAB)

Как бы вы решили, является ли это TSV или CSV?

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