2

我试图跳过 CSV 文件中的前几行。在其余行中,第一列是序数 - 1、2、3 等。但由于某种原因,使用 is_numeric 完全失败。我认为这可能是引号,但手册中的测试数组有引号,它可以正确打印出答案。

打开并检查 $afile 后...

    while (($row = fgetcsv($afile)) !== FALSE) {
        // first three rows don't have numbers in first column
        if (is_numeric($row[0]))
            print "<tr><td>{$row[7]}</td></tr>";
        else
           print "not numeric: {$row[0]}<br/>";
   }

一切都显示为“非数字”!

当我 print_r 数组时,列中仍然有引号,所以我尝试运行 str_replace 来去除引号,并且 is_numeric仍然始终显示为 false ...

完全困惑,希望有人能提供帮助,我希望这只是一个愚蠢的“午夜编码”问题......

[编辑]

好的,因为我怀疑这与数据有关,但我看不出有什么问题。当我在 BBEdit 中“显示不可见”时,每个字符之间都有一个倒置的问号。看:

图片

所以..这很奇怪。假设我要一直得到这些不可见的东西,直到我能弄清楚导出的数据.. PHP 可以做任何事情来清理数据吗?也许是字符集问题?

[再次编辑] 感谢 martinstoeckli,我使用 mb_convert_string 转换了数据,现在 is_numeric 正确返回。

4

4 回答 4

2

is_numeric 的一个非常简单的替代方法是检查您是否正在检查 int 是:

if ($row[0] == (string)(int)($row[0]))

或者如果您担心尾随空格的可能性,请检查strlen($row[0]) == strlen((int)$row[0])

于 2012-09-18T07:58:00.577 回答
1

也许它有帮助:

settype($row[0], "int");
于 2012-09-18T07:48:36.473 回答
0

根据截图,csv 文件是一个 UTF-16 编码的 Unicode 文件。此类文件为每个字符使用 2 个字节。如果您将内容转换为 UTF-8,您应该能够正常处理字符串,当然这将适用于从文件中读取的所有变量(不仅是第一个数字)。

$rowNumber = mb_convert_encoding($row[0],'utf8','utf-16');
if (is_numeric($rowNumber))
{
  ...
}
于 2012-09-19T07:12:57.587 回答
0

我愿意is_numeric((string)(int)$content);

于 2015-01-05T11:20:38.340 回答