忽略基于固定字符的csv文件上的特定行

时间:2014-01-19 09:10:24

标签: php sql sql-server csv bulkinsert

我有非常大的csv文件,其中包含银行的交易日志。有效的交易ID由<>括起。格式如下

012,10/1/2013,<13273288163624>JOHN doe .,<01-10-2013>20130930,13273288163624,10/1/2013,"10,580.00",
012,10/1/2013,SI TRANSFER,10/1/2013,"11,330,114.07",
012,10/1/2013,<555395056216>JOHN DOE1,<01-10-2013>,555395056216,10/1/2013,"46,852.00",
012,10/1/2013,<13273708949197>JOHN DOE3 -,<01-10-2013>20130930,13273708949197,10/1/2013,"57,687.00",

我们的优势在于不包含'&lt;'的行和'&gt;'需要被忽略。

有没有办法忽略这些csv行以获得如下所示的csv文件内容?

012,10/1/2013,<13273288163624>JOHN doe .,<01-10-2013>20130930,13273288163624,10/1/2013,"10,580.00",
012,10/1/2013,<555395056216>JOHN DOE1,<01-10-2013>,555395056216,10/1/2013,"46,852.00",
012,10/1/2013,<13273708949197>JOHN DOE3 -,<01-10-2013>20130930,13273708949197,10/1/2013,"57,687.00",

我想在mssql批量插入中使用csv,如下所示

BULK
INSERT nibl
FROM 'd:\2.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
FIRSTROW=2
)
GO

无效的交易(没有&lt;和&gt;的行)列数较少,导致批量插入失败

我不想使用fgetcsv使用循环beacuse csv size甚至大于100 mb

1 个答案:

答案 0 :(得分:1)

没有循环只使用explode,array_filter和implode

<?php
$csv=file_get_contents("1.csv");
$arr=explode("\n",$str);
function filter($str){
    return strpos($str,"<");
}
$new_arr=array_filter($arr,"filter");
$str=implode("\n",$new_arr);
file_put_contents("1.csv",$str);
?>
相关问题