1

我正在构建一个工具,它将接受 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";

   }
}
4

2 回答 2

1

那么 csv 已经实现了这一点。csv 的默认值是,,sep=您可以指定其他分隔符。

您可以将其实现为 csv。所以你有一个默认值,,但如果sep定义了你就使用它。

您的文件可能如下所示:

apple, orange, tomato

或者

sep=;
apple; orange; tomato

因此,如果第一行以 sep 开头,则它是“选项”行,否则存在值。对于你做的标签sep=\t

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


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

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

我还想补充一点,已经在评论中指出,如果你想猜测你会碰到它会发生的点,那是错误的。

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

之后,您检查哪些行长度相同,很可能是您的分隔符(再次猜测)

于 2013-05-30T12:22:18.860 回答
0

您可以使用这种模式来检查 csv 结构并确定分隔符:

if (preg_match('^(?:("[^"]++"|[^,;\t\n]++)(?<sep>[,\t;])(?1)(?:\n|$))++$', $csv_comma, $match))
    print_r($match['sep']);
于 2013-05-30T12:55:48.987 回答