【问题标题】:Reading a file in PHP which is half csv [closed]在PHP中读取一个半csv的文件[关闭]
【发布时间】:2012-09-04 02:23:59
【问题描述】:

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

text1,text2,text3,.................

...................................

...................................

...................................

...................................

WORD;

NUMBER

col1; col2; col3; [CSV part of the file starts from here]

value1; value2; value3

我想读取文件的 CSV 部分 并将其插入 MySql 数据库。我寻找fgetCsv 但无法这样做。有什么办法呢?

【问题讨论】:

  • 你能定义文件的格式吗?还是你得到这种格式的文件?
  • 不,我无法控制文件的格式。
  • 行数相同且以WORD;NUMBER 结尾?
  • 行数可能不同,但文件的 csv 部分总是在 NUMBER 之后开始
  • 如果您将所有数据放在一行中,并在内容块后用 \r 分隔,这很容易。

标签: php file csv


【解决方案1】:

我有一个类似的文件,我需要解析并写入几列。我决定使用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 INFILEYou can read here 结果如何 ;-)

【讨论】:

    【解决方案2】:

    您为什么不尝试读取文件的最后一行并计算分隔符的数量。之后读取文件的每一行,直到遇到具有适当数量的分隔符的行。一旦发生这种情况,从该行开始创建一个新字符串并将其解析为 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 部分的开始,你就可以打破循环并内爆数组的其余部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2018-01-18
      相关资源
      最近更新 更多