在PHP中读取一个半csv的文件


Reading a file in PHP which is half csv

我想用PHP读取一个文件,文件的结构如下:

text1,text2,text3,.................
...................................
...................................
...................................
...................................
WORD;
NUMBER
col1; col2; col3; [CSV part of the file starts from here]
value1; value2; value3

我想读取文件的CSV部分并将其插入MySql数据库。我找了fgetCsv,但找不到。怎么做?

我有一个类似的文件,需要解析并写入几列。我决定使用fgetcsv:逐行读取该文件

exec('wc -L file.tmp',$res,$stat);
$length = (int)($stat === 0 ? $res[0] : 200);
$fh = fopen('file.tmp','r');
$fields = false;
while($line = fgetcsv($fh,$length,';'))
{
    if (count($line) <= 1)//not more than one semi-colon
    {
        continue;//not part of csv-section, read on
    }
    if (!$fields)
    {
        $fields = $line;//<-- first line of CSV === columns
        continue;
    }
    //$line should be what you need here.
}

现在,在我的情况下,我决定将结果写入一个新的csv文件,并使用LOAD LOCAL INFILE。你可以在这里阅读结果;-)

为什么不尝试读取文件的最后一行并计算分隔符的数量。之后,读取文件的每一行,直到您遇到一行具有适当数量的分隔符。一旦发生这种情况,创建一个从该行开始的新字符串,并将其解析为csv。

$arr = @file('foo.php');
$lastLine = $arr[count($arr)-1];
$delimiterCount = substr_count($lastLine,";");
$csvStarted=false;
$csvString="";
foreach($line in $arr) {
    if($csvStarted) {
        $csvString += $line + "'r'n";
    } else {
        if(substr_count($line,";")==$delimiterCount) {
            $csvStarted=true;
            $csvString += $line + "'r'n";
        }
    }
}

代码效率不高,但会给你一个想法。一旦找到CSV部分的开头,就可以打断循环并内爆数组的其余部分。