我想用php打开文件CSV,但输入可以是逗号或分号 我该怎么做
我用逗号这样打开文件
if (($handle = fopen($filePath, 'r')) !== false) {
// get the first row, which contains the column-titles (if necessary)
$header = fgetcsv($handle);
while (($data = fgetcsv($handle)) !== false) {
var_dump($data);
}
}
我的文件可以是
Test;option;money
1;a;1,3
2;"G;a";1,965,0
OR
Test,option,money
1,a,"1,3"
2,"G;a",1,"965,0"
我如何测试分隔符以使用fgetcsv?
答案 0 :(得分:4)
也许你可以找到答案in this StackOverflow article。它提出了一种定界符检测方法的实现。实施是:
function getFileDelimiter($file, $checkLines = 2){
$file = new SplFileObject($file);
$delimiters = array(
',',
'\t',
';',
'|',
':'
);
$results = array();
$i = 0;
while($file->valid() && $i <= $checkLines){
$line = $file->fgets();
foreach ($delimiters as $delimiter){
$regExp = '/['.$delimiter.']/';
$fields = preg_split($regExp, $line);
if(count($fields) > 1){
if(!empty($results[$delimiter])){
$results[$delimiter]++;
} else {
$results[$delimiter] = 1;
}
}
}
$i++;
}
$results = array_keys($results, max($results));
return $results[0];
}
使用该方法可能最终得到:
$delimiter = getFileDelimiter($filePath); // actual path of the file, ex: '../example.csv'
if (($handle = fopen($filePath, 'r')) !== false) {
// get the first row, which contains the column-titles (if necessary)
$header = fgetcsv($handle, 0, $delimiter);
while (($data = fgetcsv($handle)) !== false) {
var_dump($data);
}
}
答案 1 :(得分:1)
如果分号和逗号可互换使用,则必须使用一个分隔符读取文件,然后循环遍历每个“列”并通过str_getcsv
运行以使用第二个分隔符进行解析。像这样:
if (($handle = fopen($filePath, 'r')) !== false) {
// get the first row, which contains the column-titles (if necessary)
$header = fgetcsv($handle);
while (($data = fgetcsv($handle)) !== false) {
//create empty array for this line
$line = array();
//loop over each "column" read in
foreach($data as $d){
//split using second delimeter and merge with line data
$line = array_merge($line, str_getcsv($d, ';'));
}
//display the line
print_r($line);
}
}
除此之外,您必须创建/找到支持多个分隔符的自己的csv解析器。
答案 2 :(得分:1)
你可以试试这个:
<?php
if (($handle = fopen($filePath, 'r')) !== false) {
// Detect delimiter from first line.
$delimiter = null;
if ($firstLine = fgets($handle) !== false) {
if (strpos($firstLine, ",") !== false) {
$delimiter = ",";
} elseif (strpos($firstLine, ";") !== false) {
$delimiter = ";"
}
}
if (!is_null($delimiter)) {
$isHeader = true;
while (($data = fgetcsv($handle, 0, $delimiter)) !== false) {
if ($isHeader) {
$isHeader = false;
continue;
}
var_dump($data);
}
}
}
首先尝试从第一行检测分隔符,然后在解析csv文件时使用它。