Как разобрать этот файл OFX? - PullRequest
9 голосов
/ 20 апреля 2011

это оригинальный файл ofx, полученный от m bank (не беспокойтесь, ничего особенного, я вырезал среднюю часть со всеми транзакциями)

Open Financial Exchange (OFX) - этоформат потока данных для обмена финансовой информацией, созданный на основе форматов файлов Open Financial Connectivity (OFC) Microsoft и Intuit Open Exchange.

Теперь мне нужно разобрать это.я уже видел этот вопрос , но это не обман, потому что я заинтересован в том, как это сделать.но это безобразно и подвержено ошибкам (если формат изменен, некоторые поля могут отсутствовать, форматирование / пробелы различаются и т. д. и т. д.)желаемый результат:

<?

$files = array();
$files[] = '***_2011001.ofx';
$files[] = '***_2011002.ofx';
$files[] = '***_2011003.ofx';

system('touch file.csv && chmod 777 file.csv');
$fp = fopen('file.csv', 'w');

foreach($files as $file) {
    echo $file."...\n";
    $content = file_get_contents($file);

    $content = str_replace("\n","",$content);
    $content = str_replace(" ","",$content);

    $regex = '|<STMTTRN><TRNTYPE>(.+?)<DTPOSTED>(.+?)<TRNAMT>(.+?)<FITID>(.+?)<NAME>(.+?)<MEMO>(.+?)</STMTTRN>|';


    echo preg_match_all($regex,$content,$matches,PREG_SET_ORDER)." matches... \n";


    foreach($matches as $match) {
        echo ".";
        array_shift($match);
        fputcsv($fp, $match);
    }
    echo "\n";
}
echo "done.\n";
fclose($fp);

это действительно ужасно, и если бы это был действительный XML-файл, я бы лично убил себя за это, но как это сделать лучше?

Ответы [ 2 ]

5 голосов
/ 20 апреля 2011

Ваш код выглядит нормально, учитывая, что файл не является XML или даже SGML . Единственное, что вы можете сделать, это попытаться создать более общий SAX-подобный парсер. То есть вы просто проходите через входной поток по одному блоку за раз (где блок может быть чем угодно, например, строкой или просто заданным количеством символов). Затем вызывайте функцию обратного вызова каждый раз, когда вы сталкиваетесь с <ELEMENT>. Вы даже можете пойти так же, как создать класс синтаксического анализатора, где вы можете зарегистрировать функции обратного вызова, которые слушают определенные элементы.

Это будет более общий и менее "уродливый" (для некоторого определения "уродливый"), но это будет больше кода для поддержки. Приятно делать и приятно иметь, если вам нужно много раз анализировать этот формат файла (или в разных вариациях). Если ваш опубликованный код - единственное место, где вы делаете это, просто KISS .

0 голосов
/ 17 февраля 2014
// Load Data String    
    $str = file_get_contents($fLoc);
    $MArr = array(); // Final assembled master array
// Fetch all transactions
    preg_match_all("/<STMTTRN>(.*)<\/STMTTRN>/msU",$str,$m); 
    if ( !empty($m[1]) ) {
        $recArr = $m[1]; unset($str,$m);
        // Parse each transaction record
        foreach ( $recArr as $i => $str ) {
            $_arr = array();
            preg_match_all("/(^\s*<(?'key'.*)>(?'val'.*)\s*$)/m",$str,$m); 
            foreach ( $m["key"] as $i => $key ) {
                $_arr[$key] = trim($m["val"][$i]); // Reassemble array key => val
            }
            array_push($MArr,$_arr);
        }
    }
    print_r($MArr);
...