Невозможно вставить данные в файл CSV PHP

Я занимаюсь вставкой данных в нужный CSV-файл из другого CSV-файла.

Файл CSV создается без каких-либо проблем, но он не вставляет данные массива в файл.

Он вставляет заголовок только в первую строку.

Ниже приведен код, который я пытаюсь:

date_default_timezone_set('America/New_York');
set_time_limit(0);
ini_set("memory_limit", -1);

$realPath = realpath( dirname(__FILE__) );
$path     = $realPath.'/3pltracking/'; 
$files    = scandir($path);
$FilePath = $path.$files[2]; 
$result   = array();
$date     = date('m-d-Y_his');

if (file_exists($FilePath)) 
{
    if (($handle = fopen($FilePath, "r")) !== FALSE) 
        {
            $i=0;
            while (($data = fgetcsv($handle, 10000, ",")) !== FALSE) 
            {
                $i++;
                if($i==1) continue;

                //$list = array('$data[2],$data[25],$data[4],$data[30],$data[41],$data[27]');
                echo $data[2].",".$data[25].",".$data[4].",".$data[30].",".$data[41].",".$data[27];
                echo "<br>";
                $list = array($data[2].",".$data[25].",".$data[4].",".$data[30].",".$data[41].",".$data[27]);

            // the problem is here I believe as it is empty array if I check it outside while loop
            }

        fclose($handle);

        $headers = array('ReferenceNumber', 'TotalCartons', 'ShipCarrier', 'TrackingNum', 'FreightPP', 'TotalWeight');

        $fp = fopen($realPath.'\3pltracking\TrackingFiles\Tracking_File_'.$date.'.csv', 'w');

        fputcsv($fp, $headers);

        foreach ($list as $line) {

            $val = explode(",", $line);

            fputcsv($fp, $val);

        }

        fclose($fp);

    } else {

        $body = "File Not Found";

        }
    }

Вот мои данные файла CSV:

TransactionNumber,CustomerName,ReferenceNumber,PurchaseOrderNumber,ShipCarrier,ShipService,ShipBilling,ShipAccount,EarliestShipDate,CancelDate,Notes,ShipToName,ShipToCompany,ShipToAddress1,ShipToAddress2,ShipToCity,ShipToState,ShipToZip,ShipToCountry,ShipToPhone,ShipToFax,ShipToEmail,ShipToCustomerName,ShipToDeptNumber,ShipToVendorID,TotalCartons,TotalPallets,TotalWeight,TotalVolume,BOLNum,TrackingNum,TrailerNum,SealNum,ShipDate,ItemNumber,ItemQuantityOrdered,ItemQuantityShipped,ItemLength,ItemWidth,ItemHeight,ItemWeight,FreightPP,WarehouseID,LotNumber,SerialNumber,ExpirationDate,Supplier,Cost,FulfillInvShippingAndHandling,FulfillInvTax,FulfillInvDiscountCode,FulfillInvDiscountAmount,FulfillInvGiftMessage,SoldToName,SoldToCompany,SoldToAddress1,SoldToAddress2,SoldToCity,SoldToState,SoldToZip,SoldToCountry,SoldToPhone,SoldToFax,SoldToEmail,SoldToCustomerID,SoldToDeptNumber,FulfillInvSalePrice,FulfillInvDiscountPct,FulfillInvDiscountAmt
242328,PARADIGM TRENDS,123810,40-402849,CUSTOMER PICK UP,LTL,FreightCollect,,,,,HG BUYING- JEFFERSON DC 884,HG BUYING- JEFFERSON DC 884,125 LOGISTICS CENTER PKWY,,JEFFERSON,AL,30549,US,,,,,,,30,0,30,0.0174,,,,,,DOV3S,64,64,4,1,1,4,0,1,,,,,,0,0,,0,,,,,,,,,,,,,,,0,0,0
33,d,123810,40-402849,CUSTOMER PICK UP,LTL,FreightCollect,,,,,HG BUYING- JEFFERSON DC 884,HG BUYING- JEFFERSON DC 884,125 LOGISTICS CENTER PKWY,,JEFFERSON,AL,30549,US,,,,,,,30,0,30,0.0174,,,,,,DOV3S,64,64,4,1,1,4,0,1,,,,,,0,0,,0,,,,,,,,,,,,,,,0,0,0
44,PARAdgdfDIGM TRENDS,123810,40-402849,CUSTOMER PICK UP,LTL,FreightCollect,,,,,HG BUYING- JEFFERSON DC 884,HG BUYING- JEFFERSON DC 884,125 LOGISTICS CENTER PKWY,,JEFFERSON,AL,30549,US,,,,,,,30,0,30,0.0174,,,,,,DOV3S,64,64,4,1,1,4,0,1,,,,,,0,0,,0,,,,,,,,,,,,,,,0,0,0
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,BY3M,176,176,11,1,1,11,,,,,,,,,,,,,,,,,,,,,,,,,,0,0,0

person Community    schedule 17.07.2016    source источник
comment
CSV означает Cзапятая-Sразделенные Vзначения. Вы скрыли ЗАПЯТЫЕ (,) в файле CSV или....?   -  person Poiz    schedule 17.07.2016
comment
Нет, не скрыт. В основном я вручную создаю CSV-файл, используя эти данные, а затем анализирую его, а затем выбираю нужные поля и пытаюсь создать CSV-файл.   -  person    schedule 17.07.2016
comment
Ааа... Хорошо... не могли бы вы показать нам фрагмент содержимого файла .../3pltracking/whatever.csv? Только первые 4 строки были бы очень полезны...   -  person Poiz    schedule 17.07.2016
comment
@Poiz Я добавил действительные данные CSV, и они содержат все данные .../3pltracking/whatever.csv. Это нормально?   -  person    schedule 17.07.2016
comment
You Rock... Да... это нормально.... Подождите несколько минут... с этими данными любому будет легче протянуть руку, не откусив ни одного ногтя... просто подождите несколько минут. минут ;-)   -  person Poiz    schedule 17.07.2016
comment
Да, я забыл добавить достоверные данные, поэтому все задержки возникают в ответах;) Не могли бы вы взглянуть? :) в любом случае спасибо.   -  person    schedule 17.07.2016
comment
С этими вашими заявлениями мне больше понятно. :) Я даю ему несколько минут сейчас. :)   -  person    schedule 17.07.2016
comment
Теперь вы можете попробовать вместо несколько минут... ;-)   -  person Poiz    schedule 17.07.2016
comment
Хахаха. :) Ваш подход действительно исключительный. ;-) мне потребовалось 10 минут, чтобы понять весь код. :)   -  person    schedule 17.07.2016
comment
Это цена, которую вы платите за неправильное истолкование Подождите несколько минут ;-) Я так рада, что это сработало для вас, а также что даже старые школьные штучки, такие как наши старшие бабушки и дедушки, до сих пор Их Место в Схеме вещей LOL :-) Приветствую, приятель, и удачи!!! ;-)   -  person Poiz    schedule 17.07.2016


Ответы (1)


Есть так много способов сделать это... включая str_getcsv($csvData). Однако здесь мы бы выбрали что-то old-school и немного извращенное ;-). Мы бы создали функцию, которая использует Regex и конструкцию Looping для создания соответствующей структуры данных CSV. Функция ниже иллюстрирует, как это сделать. Также обратите внимание, хотя мы упоминали, что это несколько искаженный подход старой школы: не дайте себя одурачить... потому что он все еще делает свое дело ;-).

    <?php

        $csvSourceFile          = __DIR__ . "/1.csv";
        $csvPreferredColumns    = array('ReferenceNumber', 'TotalCartons', 'ShipCarrier', 'TrackingNum', 'FreightPP', 'TotalWeight');
        $newCsvStrut            = processCSVData($csvSourceFile,  $csvPreferredColumns, __DIR__ . "/test.csv");

        /**
         * @param $csvSource                 // PATH TO THE MAIN CSV FILE
         * @param array $csvPreferredColumns // ARRAY OF HEADER COLUMN-NAMES TO BE EXTRACTED FROM MAIN CSV
         * @param null $newCSVFileName       // NAME OF THE NEW CSV FILE TO BE CREATED.
         * @return string
         */
        function processCSVData($csvSource, array $csvPreferredColumns, $newCSVFileName=null){
            // GET THE CONTENTS OF THE CSV FILE & STORE IT IN A VARIABLE
            $csvData        = file_get_contents($csvSource);

            // SPLIT THE CONTENTS OF THE CSV FILE LINE BY LINE: THAT IS; AT THE END OF EACH LINE
            // THUS CONVERTING THE DATA TO AN ARRAY...
            $arrCsvLines    = preg_split("#\n#", $csvData);

            //FILTER OUT UNWANTED EMPTY VALUES FROM THE ARRAY
            $arrCsvLines    = array_filter($arrCsvLines);

            // CREATE SOME VARIABLES TO BE USED WITHIN THE LOOP...
            $strDataFinal   = "";
            $arrDataMain    = $arrDataFinal = array();

            // IF THERE IS MORE THAN ONE LINE IN THE ARRAY WE CREATED ABOVE,
            // THEN CONTINUE PROCESSING THE DATA...
            if($arrCsvLines && count($arrCsvLines)>0){
                // SINCE THE HEADER IS ALWAYS THE FIRST LINE IN THE CHAIN,
                // WE EXPLICITLY EXTRACT IT AND STORE IT IN A VARIABLE FOR LATER USE
                $arrCsvHeaders = preg_split("#\,([\s\t]+)?#", $arrCsvLines[0]);

                // NOW WE LOOP THROUGH ALL THE LINES WE CREATED BY SPLITTING THE CONTENTS
                // OF THE CSV FILE AT THE END-OF-LINE BOUNDARY
                foreach($arrCsvLines as $key=>$arrCsvLine){
                    // WE DON'T WANT ANYTHING AT INDEX "0" SINCE IT IS THE HEADER
                    // AND WE ALREADY DEALT WITH IT ABOVE....
                    // SO IF THE INDEX $key IS NOT 0, WE CAN CONTINUE PROCESSING
                    if($key != 0){
                        $arrDataTemp    = array();
                        $arrTempCsvData = preg_split("#\,([\s\t]+)?#", $arrCsvLine);
                        foreach($arrTempCsvData as $iKey=>$sData){
                            $arrDataTemp[$arrCsvHeaders[$iKey]] = $sData;
                        }
                        $arrDataMain[] = $arrDataTemp;
                    }
                }

                foreach($arrDataMain as $iKey=>$subData){
                    $arrTempFinal   = array();
                    foreach($subData as $key=>$data){
                        if(in_array($key, $csvPreferredColumns)){
                            $arrTempFinal[$key] = $data;
                        }
                    }
                    $arrDataFinal[] = implode(",\t", $arrTempFinal);
                }

                $arrDataFinal   = array_merge( array(implode(",\t", $csvPreferredColumns)), $arrDataFinal);
                $strDataFinal   = implode("\n", $arrDataFinal);

                if($newCSVFileName){
                    file_put_contents($newCSVFileName, $strDataFinal);
                }
            }
            return $strDataFinal;
        }

        var_dump($newCsvStrut);
        // PRODUCES SOMETHING SIMILAR TO THE LINES BELOW:
        string 'ReferenceNumber,    TotalCartons,   ShipCarrier,    TrackingNum,    FreightPP,  TotalWeight
                123810, CUSTOMER PICK UP,   30, 30, ,   0
                123810, CUSTOMER PICK UP,   30, 30, ,   0
                123810, CUSTOMER PICK UP,   30, 30, ,   0
                ,   ,   ,   ,   ,   ' (length=204)
person Poiz    schedule 17.07.2016
comment
Ваше решение действительно сработало идеально. :D Серьезно, это отличный подход, даже если это что-то из старой школы ;-) - person ; 17.07.2016