在PHP中检测文件格式

时间:2013-05-30 12:17:01

标签: php regex csv

我正在构建一个接受CSV或制表符分隔文件的工具,然后对其进行解析并将数据数据库化。

上传的文件可以是CSV或制表符分隔。

我提出了一个可行的解决方案(下面),用于检测文件的格式,并想知道是否有更好的方法来解决这个问题和/或你们中的任何人如何解决了同样的问题

由于

<?php

$csv_comma='Fruit,Color
Apple,"Red,Green"
Tomato,"Red,Green"
Banana,Yellow
Tangerine,Orange
';


$csv_semi_colon='Fruit;Color
Apple;"Red,Green"
Tomato;"Red,Green"
Banana;Yellow
Tangerine;Orange
';


$tab_delimited='Fruit   Color
Apple   Red,Green
Tomato  Red,Green
Banana  Yellow
Tangerine   Orange';


$fileArr = array($csv_comma,$csv_semi_colon,$tab_delimited);


foreach($fileArr as $file){

   if(preg_match('/^(.+),(.+)/',trim($file))){

       echo "CSV with comma separator";

   }

   if(preg_match('/^(.+);(.+)/',trim($file))){

       echo "CSV with semi colon separator";

    }


   if(preg_match('/^(.+)\t(.+)/',trim($file))){

       echo "Tab delimited";

   }
}

2 个答案:

答案 0 :(得分:1)

好的csv有很多实现。 csv的默认值为,,但sep=可以指定其他分隔符。

您可以将其实现为csv。因此,您的默认值为,,但如果sep已定义,则使用该值。

您的文件可能如下所示:

apple, orange, tomato

sep=;
apple; orange; tomato

因此,如果第一行以sep开头,则它是“选项”行,否则有值。对于标签,您执行sep=\t

现在用户可以定义自己的分隔符而不再猜测


在对用户易于使用的CBroe的一些评论之后,可能会有一些变化。 csv只接受一个charachter作为septerator,以便系统可以像上面那样使用。 cvs编辑器(如excel)将为用户处理

如果用户使用该选项卡,则它不是csv文件,而是.txt(例如)。因此,您可以根据给定的文件更改默认值。

另外我想补充一点,已经在评论中指出,如果你想猜测你会发现它会发生错误。

我不知道文件的设置,但csv行需要长度相同(根据我的记忆)。所以你能做的就是读出前x行。并使用每个分隔符。

之后你检查哪些线长度相同,最有可能是你的分隔符(再次猜测)

答案 1 :(得分:0)

您可以使用此类模式检查csv结构并确定分隔符:

if (preg_match('^(?:("[^"]++"|[^,;\t\n]++)(?<sep>[,\t;])(?1)(?:\n|$))++$', $csv_comma, $match))
    print_r($match['sep']);