1 Востаннє редагувалося Invader (18.01.2013 11:31:25)

Тема: Exсel, CSV, обробка

У мене є CSV файл згенерований Exel. В цьому файлі є записи в двох стовпчиках. Потрібно записи в першому і в наступному стовпчику занести у відповідні змінні. В 1-му стовпчику назви фірм, в іншому числа. Я вичлєняю одне від іншого базуючись на тому факті, що… коротше пишу отаке

function rpl($var){
    $length = strpos($var, ";");
    $v = substr($var, 0, $length);
    $v = trim($v);
    
    return $v;
}

і отримую назви фірм, але виникла проблема — між назвою фірми і числом не має бути фраз, слів, букв, символів на зразок "Не опубликовано". Як з цим боротися? Я про якийсь спосіб щоб можна було ідентифікувати довільний набір символів як назва фірми, решту симолів як непотрібне сміття, решту як число. Є спосіб писати щось таке:

$firm = $csvFile[A][1];
$number = $csvFile[J][2];

Або як зробити так щоб дані мені присилали не в якомусь CSV а в добре структурованому XML?

2

Re: Exсel, CSV, обробка

берете рядок з cvs файлу і розбиваєте його по ;

function convertLineToArray($cvsLine){
   $data = explode(';', $cvsLine);
    return $data;
}

3 Востаннє редагувалося Invader (17.01.2013 13:42:05)

Re: Exсel, CSV, обробка

Я так пробував, але проблема в тому що знак ; може бути оточений довільною к-тю пробілів. А якщо використати регулярний вираз в функції explode?

4

Re: Exсel, CSV, обробка

що мішає очистити довільну кількість пробілів trim()'ом наприклад?

5

Re: Exсel, CSV, обробка

Може оцей парсер CSV підійде? http://www.bennadel.com/blog/1504-Ask-B … ommand.htm

Подякували: Invader1

6 Востаннє редагувалося virua (17.01.2013 14:40:11)

Re: Exсel, CSV, обробка

Для роботи з Excel я використовую бібліотеку PHPExcel. Дуже потужна, але водночас і монструозна. Вміє працювати і з CSV.

Або ж спробуйте так (стандартні методи PHP):

1) Функція getcsv читає рядок з файлу і робить розбір даних CSV;

2) Функція str_getcsv:

$csvData = 'IN,India,02,"Andhra Pradesh",Razole,16.4833,81.8333,,,Asia/Calcutta,AS,,BSNL,BSNL,bsnl.in,"AS9829 National Internet Backbone",Cable/DSL,residential,30,99,33,99,,';

$arrData = str_getcsv($csvData);

$resultData = array(
    'country_code' => $arrData[0],
    'country_name' => $arrData[1],
    'region_code' => $arrData[2],
    'region_name' => $arrData[3],
    'city_name' => $arrData[4]
);
Подякували: Invader1

7

Re: Exсel, CSV, обробка

virua написав:

Для роботи з Excel я використовую бібліотеку PHPExcel. Дуже потужна, але водночас і монструозна. Вміє працювати і з CSV.

Або ж спробуйте так (стандартні методи PHP):

1) Функція getcsv читає рядок з файлу і робить розбір даних CSV;

2) Функція str_getcsv:

$csvData = 'IN,India,02,"Andhra Pradesh",Razole,16.4833,81.8333,,,Asia/Calcutta,AS,,BSNL,BSNL,bsnl.in,"AS9829 National Internet Backbone",Cable/DSL,residential,30,99,33,99,,';

$arrData = str_getcsv($csvData);

$resultData = array(
    'country_code' => $arrData[0],
    'country_name' => $arrData[1],
    'region_code' => $arrData[2],
    'region_name' => $arrData[3],
    'city_name' => $arrData[4]
);

ліба то хороша, но мені здається шо цей монстр зїсть всю мою оперативку вилізе з екрана і зжере і мене )
функціональна, но rtfm дуже ліньки)
є вот така ліба
http://code.google.com/p/php-excel-reader/
вона написана давно, але дуже шустра
якшо не треба багато функціоналу, то це в самий раз

Подякували: Invader1

8

Re: Exсel, CSV, обробка

Ой блін, я переплутав PHP з JavaScript не подивившись назву теми... :) Той парсер CSV не підійде.

9

Re: Exсel, CSV, обробка

Допиляв під ваші потреби))

function convertLineToArray($cvsLine){
    $data = explode(';', $cvsLine);
    foreach($data as $index=>$value){
      $data[$index] = trim($value);
    }
    return $data;
}

10 Востаннє редагувалося Invader (17.01.2013 20:50:45)

Re: Exсel, CSV, обробка

if($filenames){
    foreach($filenames as $fileNm){
        $wf = fopen($fileNm,'rt') or die('wrfwwefr);
        while(($w = fgetcsv($wf)) !== false){
            #echo $w;
            foreach($w as $strToReplace){
                #print_r($w);
                #if (stristr($strToReplace,"SIEMENS")) echo "YEs";
                #array_walk($s,func,$strToReplace);
                }
            }
        }
    }
}

function func($value, $key, $strToReplace){
    global $numbers, $fileNm,$y;
    $arrayToWrite = array();

    /*echo $flName."<br/>";
    echo $key."<br/>";
    echo $strToReplace."<br/>";echo $value;*/
    if(stristr($strToReplace,$value)){
        echo "bas";
        $arrayToWrite[] = $numbers[$key];
    }
    /*echo $flName;
    echo $value;
    print_r($arrayToWrite);exit;*/
    #file_put_contents($pathToDir.'/'.$flName, $arrayToWrite);
    
}

Напевно я чогось не розумію, але функція func викликається лише один раз, а не стільки разів скільки елементів в масиві $s. Допоможіть. Потрібно щоб всі елементи масиву порівнювалися з кожним рядком. Чи якось так.

11

Re: Exсel, CSV, обробка

Invader написав:
if($filenames){
    foreach($filenames as $fileNm){
        $wf = fopen($fileNm,'rt') or die('wrfwwefr);
        while(($w = fgetcsv($wf)) !== false){
            #echo $w;
            foreach($w as $strToReplace){
                #print_r($w);
                #if (stristr($strToReplace,"SIEMENS")) echo "YEs";
                #array_walk($s,func,$strToReplace);
                }
            }
        }
    }
}

function func($value, $key, $strToReplace){
    global $numbers, $fileNm,$y;
    $arrayToWrite = array();

    /*echo $flName."<br/>";
    echo $key."<br/>";
    echo $strToReplace."<br/>";echo $value;*/
    if(stristr($strToReplace,$value)){
        echo "bas";
        $arrayToWrite[] = $numbers[$key];
    }
    /*echo $flName;
    echo $value;
    print_r($arrayToWrite);exit;*/
    #file_put_contents($pathToDir.'/'.$flName, $arrayToWrite);
    
}

Напевно я чогось не розумію, але функція func викликається лише один раз, а не стільки разів скільки елементів в масиві $s. Допоможіть. Потрібно щоб всі елементи масиву порівнювалися з кожним рядком. Чи якось так.

в такому вигляді, вона не повинна нічого робити :)

12 Востаннє редагувалося funivan (17.01.2013 22:10:26)

Re: Exсel, CSV, обробка

Дам пораду. В першу чергу підтягніть знання з програмування на PHP а тоді парсіть cvs файл. Нічого не вийде якщо так писати код.
те що він не відноситься до якісного коду це одне але він навіть не є робочим. До речі, колбеки так не задаються як ви написали ;)

p.s. не забуваємо про спойлери ))

13 Востаннє редагувалося Invader (18.01.2013 11:32:14)

Re: Exсel, CSV, обробка

Я таки написав робочий код який опрцьовує CSV файли.
Тепер воно виглядає так:

if($filenames){
    foreach($filenames as $fileNm){
        $wf = fopen($fileNm,'rt') or die('Укк');
        $fileToWrite = createFileName($fileNm);
        while(($w = fgetcsv($wf)) !== false){
               array_walk($firms,fd, $w);
}
}
}


function fd($value,$key,$w){
    global $fileToWrite,$numbers;
    $pos = stripos($w[0],$value);

    if ($pos !== false){
       file_put_contents($fileToWrite, $numbers[$key]."\n", FILE_APPEND);
     }
}

До речі, колбеки так не задаються як ви написали

Трохи детальніше?

14

Re: Exсel, CSV, обробка

Тепер воно виглядає так:

Виглядати то виглядає але він все рівно не робочий. якщо ви скопіюєте цей код у файл і запустите його він не буде працювати. Зробіть що б працював а тоді ми допоможемо з тим як зчитувати інформацію у масив, хоча ми уже це вище описували.
В першу чергу видайте сюди робочий код!!!

Подякували: Voron1

15

Re: Exсel, CSV, обробка

Та вже все працює. Дані з файлу зчтиуються і заносяться в інший файл. А що з колбеками?

16 Востаннє редагувалося Voron (18.01.2013 11:24:57)

Re: Exсel, CSV, обробка

Invader, код не робочий, оскільки у ньому що найменше дві помилки:

or die('Укк);

загубили '

function fd($value,$key,$w){
    global $fileToWrite,$numbers;
    $pos = stripos($w[0],$value);
 
    if ($pos !== false){
       file_put_contents($fileToWrite, $numbers[$key]."\n", FILE_APPEND);
}

- неспівпадає кількість відкритих і закритих фігурних дужок

17 Востаннє редагувалося Invader (18.01.2013 11:43:14)

Re: Exсel, CSV, обробка

Моя неуважність при копіюванні сюди.

18

Re: Exсel, CSV, обробка

http://php.net/manual/en/function.array-walk.php  ось посилання на офіційну документацію

array_walk($fruits, 'test_print');  // як правильно задають колбек
array_walk($fruits, test_print);  // як не задають колбек. 

у вас він заданий невірно
Краще перепишіть через форіч без всяких array_walk так буде краще на даному етапі, потім дальше поглянемо  ;)

p.s. Копіюйте код уважно і перед тим як закинути на форум перевіряйте чи працює, якщо щось не працює і ви стараєтесь це поправити вказуйте помилки і тд. Дякую)

Подякували: Invader1

19

Re: Exсel, CSV, обробка

Чогось мені здвадалося що другий варіант правильний.