我希望在这里找到一些PHPExcel用户,因为他们的讨论组中的活动似乎有点悠闲的一面:)。 (我的原帖can be seen here)
我在一起划分了一个功能,用于自动检测CSV文件的分隔符和/或附件 现在它正在运行,我想将它插入PHPExcel(通过扩展CSV类) 我唯一的问题是我的OOP技能非常年轻,而且我在找到如何/在哪里集成它时遇到了一些麻烦。
我的功能目前通过file()
创建一个数组,但如果需要,我可以轻松更改。
function autoDetect(array $file, array $toDetect=array(true,false), $sampleSize=5){
$detectDelim = $toDetect[0]? true: false;
$detectEncl = $toDetect[1]? true: false;
$sampleSize = ( count($file) < $sampleSize)? count($file): $sampleSize; // set sample-size to the lesser value
array_splice($file, $sampleSize); // trim down the array to only first X rows
$delimiters = array(',','^','.',';',':',"\t"); // first elem will be the dflt
$delimRegex = implode('',$delimiters);
$enclosures = array('"',"'",'^'); // first elem will be the dflt
$enclRegex = implode('',$enclosures);
foreach ($file as $row) {
$row=preg_replace( '/\r\n/', '', trim($row) ); // clean up .. strip new line and line return chars
if($detectDelim){
$stripped=preg_replace( "/[^$delimRegex]/", '', $row); // clean up .. strip evthg x'ept dilim's
$delimRowChars = str_split($stripped); // get each char so we can inspect individually
$delimCount = _count_instances($delimRowChars, $delimiters); // TODO : fix how this overwrites itself
// TODO : set delim
}
if($detectEncl){
$stripped=preg_replace( "/[^$enclRegex]/", '', $row); // clean up .. strip evthg x'ept dilim's
$enclRowChars = str_split($stripped); // get each char so we can inspect individually
$enclCount = _count_instances($enclRowChars, $enclosures); // TODO : fix how this overwrites itself
// TODO : set encl
}
}
echo'<pre>delims found in sample set: ', print_r($delimCount), '</pre>'; // For Testing ---->
echo'<pre>encls found in sample set: ', print_r($enclCount), '</pre>'; // For Testing ---->
echo "<pre>Suggested Delimiter: '",_array_max($delimCount),"' </pre>"; // For Testing ---->
echo "<pre>Suggested Enclosure: '",_array_max($enclCount),"' </pre>"; // For Testing ---->
//return TODO ;
}
/**
*
*/
function _count_instances(array $haystacks, array $needles, $maxOnly = false){
$basket = array(); // instantiate
foreach ($haystacks as $haystack) {
foreach ($needles as $needle) { // this throws an undef'd index err and adds an element to the array
if( strpos($haystack, $needle) !== false) { // if the needle is in the haystack ...
if($needle == "\t") $needle = '\t'; // TODO : decouple this from "\t" so it can work for other chars too
$basket[$needle]++; // ... increment
}
}
}
if($maxOnly) $basket = _array_max($basket);
return $basket;
}
/**
*
*/
function _array_max(array $target){
$target = array_keys($target, max($target));
$target = $target[0];
return $target;
}
我只需要在解析文件之前运行我的自动检测器,而我没有在对象中看到信息。
何时/何地/如何插入?
是否可以访问orig文件,或???
答案 0 :(得分:1)
PHPExcel社区确实最终提供了回复,所以我想我为了后人的缘故在这里做了一件事:) 它也可以通过OP顶部提供的链接看到。
&#34;您需要将呼叫置于此自动检测器中 PHPExcel / Reader / CSV.php文件的loadIntoExisting方法;但是 脚本一次读取一行CSV而不是加载每一行 进入记忆(我们有足够的记忆问题,而没有刻意尝试 创造它们)。从逻辑上讲,您可能只想加载一些 在检查BOM后立即行,设置 $ this-&gt; _delimiter值,然后记得倒回文件 事后&#34;
希望它可以帮助别人。