当分隔符变化时,我应该如何解析php中的csv文件?

发布于 2024-11-04 17:38:28 字数 104 浏览 0 评论 0原文

OpenOffice Excel编辑保存的csv文件的分隔符似乎是“;”虽然microsoft office excel是“,”,但我应该如何编写一个程序来解析csv文件,无论它使用哪个分隔符?

It seems that the delimiter of csv file edited and saved by OpenOffice Excel is ";" while microsoft office excel is ",", how should i write a program to parse the csv file no matter which delimiter it uses?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

倾`听者〃 2024-11-11 17:38:28

我在我的一个应用程序中使用此函数来确定使用哪个分隔符:

function get_separator( $csvstring, $fallback = ';') {
    $seps = array(';',',','|',"\t");
    $max = 0;
    $separator = false;
    foreach($seps as $sep){
        $count = substr_count($csvstring, $sep);
        if($count > $max){
            $separator = $sep;
            $max = $count;
        }
    }

    if($separator) return $separator;
    return $fallback;
}

它基本上检查最多出现哪个分隔符并返回它。现在可以正常使用大约两年了

I'm using this function in one of my apps to determine which separator is used:

function get_separator( $csvstring, $fallback = ';') {
    $seps = array(';',',','|',"\t");
    $max = 0;
    $separator = false;
    foreach($seps as $sep){
        $count = substr_count($csvstring, $sep);
        if($count > $max){
            $separator = $sep;
            $max = $count;
        }
    }

    if($separator) return $separator;
    return $fallback;
}

It basically checks which separator occurs at most and returns it. It works without problems for about two years now

心碎的声音 2024-11-11 17:38:28

使用 SplFileObject::getCsvControl 方法。
用法示例:

<?php
$csvFileObject = new SplFileObject($_FILES["csv"]["tmp_name"]);
list($delimiter, $enclosure) = $csvFileObject->getCsvControl();

$lines = fopen($_FILES["csv"]["tmp_name"], 'r');
if($lines) {
    while (($line = fgetcsv($lines, 4096, $delimiter, $enclosure)) !== false) {
        //do something
    }
}    

参考:http://php.net/manual/en/splfileobject.getcsvcontrol。 php

Use SplFileObject::getCsvControl method.
Example usage:

<?php
$csvFileObject = new SplFileObject($_FILES["csv"]["tmp_name"]);
list($delimiter, $enclosure) = $csvFileObject->getCsvControl();

$lines = fopen($_FILES["csv"]["tmp_name"], 'r');
if($lines) {
    while (($line = fgetcsv($lines, 4096, $delimiter, $enclosure)) !== false) {
        //do something
    }
}    

Reference: http://php.net/manual/en/splfileobject.getcsvcontrol.php

莫相离 2024-11-11 17:38:28

fgetcsv() 允许您指定分隔符作为第三个参数。

至于自动检测,有一些有趣的答案 这个问题

fgetcsv() allows you to specify the delimiter as the third argument.

As for automatically detecting, there are some interesting answers for this question.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文