2014-01-19 3 views
1

У меня очень большие файлы csv, содержащие журнал транзакций банка. Действительный идентификатор транзакции заключен в <>. Формат как нижеигнорировать определенную строку в файле csv на основе фиксированного символа

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", 

Преимущество у нас в том, что линия, которая не содержит «<» и «>» должны быть проигнорированы.

Есть ли способ игнорировать эти строки 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", 

Я хочу использовать CSV в Mssql объеме вставки, как показано ниже

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

Invalid сделки (линия без < и>) имеют меньше нет столбцов, которые приводят к выходу из строя основной массы вставки

Я не хочу использовать циклы, используя fgetcsv beacuse csv, размер еще больше 100 мб

+1

Почему вы вручную раскалываете/разбираете csv? используйте 'fgetcsv()', а затем 'if (substr ($ row [2], 0, 1) == '<')) {continue; } '. –

+0

Согласитесь с Marc B. Я использую [** splfileobject **] (http://www.php.net/manual/en/class.splfileobject.php) и '-> seek()'/'-> fgetcsv () 'когда мне нужно разобрать огромные CSV-файлы (200-400mb) - взгляните на это. – davidkonrad

+0

Я пытаюсь сделать объемную вставку без использования fgetcsv. это действительно замедлит весь процесс. no loop please \ – sumit

ответ

1

no loop просто использовать 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); 
?> 
Смежные вопросы