18

時間追跡、給与計算、人事管理を行う Web アプリケーションがあります。その結果、他のシステム (州税申告、ACH ファイルなど) にエクスポートするために、多くの固定幅データ ファイルを作成する必要があります。レコードの種類/構造を定義し、OOP パラダイムでそれらを操作できる、このための優れたライブラリを知っている人はいますか?

アイデアは、仕様を渡し、その仕様のインスタンスを操作するクラスです。いいえ:

$icesa_file = new FixedWidthFile();
$icesa_file->setSpecification('icesa.xml');
$icesa_file->addEmployer( $some_data_structure );

icesa.xml は仕様を含むファイルですが、OOP 呼び出しを使用して自分で定義することもできます。

$specification = new FixedWidthFileSpecification('ICESA');
$specification->addRecordType(
    $record_type_name = 'Employer',
    $record_fields = array(
         array('Field Name', Width, Vailditation Type, options)
         )
     );

編集:そのようなライブラリの書き方についてアドバイスを求めているわけではありません。既に存在するかどうかを知りたかっただけです。ありがとうございました!!

4

7 に答える 7

3

私は以前、このクラスを同様の用途に喜んで使用しました。これはphp-classesファイルですが、非常に評価が高く、多くの人によって試され、テストされています。それは新しいものではありませんが(2003)、それでも非常に優れた仕事をします + 他の多くのグッズを追加して投稿した例のように見える非常にまともでクリーンなAPIを備えています。

例でのドイツ語の使用法と年齢係数を無視できる場合->それは非常にまともなコードです。

Posted from the example:


//CSV-Datei mit Festlängen-Werten 
echo "<p>Import aus der Datei fixed.csv</p>"; 
$csv_import2 = new CSVFixImport; 
$csv_import2->setFile("fixed.csv"); 
$csv_import2->addCSVField("Satzart", 2); 
$csv_import2->addCSVField("Typ", 1); 
$csv_import2->addCSVField("Gewichtsklasse", 1); 
$csv_import2->addCSVField("Marke", 4); 
$csv_import2->addCSVField("interne Nummer", 4); 


$csv_import2->addFilter("Satzart", "==", "020"); 
$csv_import2->parseCSV(); 
if($csv_import->isOK()) 
{ 
    echo "Anzahl der Datensätze: <b>" . $csv_import2->CSVNumRows() . "</b><br>"; 
    echo "Anzahl der Felder: <b>" . $csv_import2->CSVNumFields() . "</b><br>"; 
    echo "Name des 1.Feldes: <b>" . $csv_import2->CSVFieldName(0) . "</b><br>"; 

    $csv_import2->dumpResult(); 
}

私の2セント、頑張ってください!

于 2011-05-31T14:08:56.387 に答える
1

固定幅レコードを具体的に処理する PHP ライブラリを知りません。ただし、ファイルの各行を自分で分割できる場合は、データ フィールドの行をフィルター処理して検証するための優れたライブラリがいくつかあります。

Zend FrameworkのZend_FilterおよびZend_Validateコンポーネントを見てください。どちらのコンポーネントも自己完結型であり、Zend_Loader のみが機能する必要があると思います。必要に応じて、これら 3 つのコンポーネントだけを Zend Framework から取り出し、残りを削除することができます。

Zend_Filter_Inputは、フィルタとバリデータのコレクションのように機能します。データ セットの各レコードを処理するために使用できるデータ レコードの各フィールドに対して、一連のフィルターとバリデーターを定義します。便利なフィルターとバリデーターが既に多数定義されており、独自のインターフェースを作成するのは非常に簡単です。パディング文字を削除するには、StringTrim フィルターをお勧めします。

各行をフィールドに分割するには、Zend_Filter_Input クラスを拡張し、次のように setDataFromFixedWidth() というメソッドを追加します。

class My_Filter_Input extends Zend_Filter_Input
{
    public function setDataFromFixedWidth($record, array $recordRules)
    {
        if (array_key_exists('regex', $recordRules) {
            $recordRules = array($recordRules);
        }

        foreach ($recordRules as $rule) {
            $matches = array();
            if (preg_match($rule['regex'], $record, $matches)) {
                $data = array_combine($rule['fields'], $matches);
                return $this->setData($data);
            }
        }

        return $this->setData(array());
    }

}

また、単純な正規表現と一致するフィールド名を使用して、さまざまなレコード タイプを定義します。ICESA は次のようになります。

$recordRules = array(
    array(
        'regex'  => '/^(A)(.{4})(.{9})(.{4})/',  // This is only the first four fields, obviously
        'fields' => array('recordId', 'year', 'federalEin', 'taxingEntity',),
    ),
    array(
        'regex'  => '/^(B)(.{4})(.{9})(.{8})/',
        'fields' => array('recordId', 'year', 'federalEin', 'computer',),
    ),
    array(
        'regex'  => '/^(E)(.{4})(.{9})(.{9})/',
        'fields' => array('recordId', 'paymentYear', 'federalEin', 'blank1',),
    ),
    array(
        'regex'  => '/^(S)(.{9})(.{20})(.{12})/',
        'fields' => array('recordId', 'ssn', 'lastName', 'firstName',),
    ),
    array(
        'regex'  => '/^(T)(.{7})(.{4})(.{14})/',
        'fields' => array('recordId', 'totalEmployees', 'taxingEntity', 'stateQtrTotal'),
    ),
    array(
        'regex'  => '/^(F)(.{10})(.{10})(.{4})/',
        'fields' => array('recordId', 'totalEmployees', 'totalEmployers', 'taxingEntity',),
    ),
);

次に、データ ファイルを 1 行ずつ読み取り、入力フィルターにフィードします。

$input = My_Filter_Input($inputFilterRules, $inputValidatorRules);
foreach (file($filename) as $line) {
    $input->setDataFromFixedWidth($line, $recordRules);
    if ($input->isValid()) {
        // do something useful
    }
    else {
        // scream and shout
    }
}

ファイルに書き戻すためにデータをフォーマットするには、おそらく、内部 str_pad 関数をラップする独自の StringPad フィルターを作成する必要があります。次に、データセット内の各レコードについて:

$output = My_Filter_Input($outputFilterRules);
foreach ($dataset as $record) {
    $output->setData($record);
    $line = implode('', $output->getEscaped()) . "\n";
    fwrite($outputFile, $line);
}

お役に立てれば!

于 2011-05-27T15:19:31.087 に答える
0

これがフィールドが区切られたテキストファイルの場合、-自分で作成する必要があります。おそらくそれは大きな問題ではありません。良い組織は、多くの時間を節約します。

  1. 構造を定義するための普遍的な方法が必要です。つまり、xml。
  2. あなたは何かを生成する必要があります...特に私はこれのためにSmartyテンプレートを好みます。

だからこれ:

   <group>

      <entry>123</entry>

      <entry>123</entry>

      <entry>123</entry>

    </group>

このテンプレートを使用すると、テストに簡単に解釈できます。

{section name=x1 loop=level1_arr}

{--output root's--}

  {section name=x2 loop=level1_arr[x1].level2_arr}

     {--output entry's--}

  {/section}

{/section}

これは単なるアイデアです。

しかし、想像してみてください。

  1. xmlが必要です
  2. テンプレートが必要です

つまり、テキスト構造を抽象化するための2つの定義

于 2011-05-07T11:21:20.620 に答える
0

あなたが提供したよりも少し多くの情報が必要だと思います: レコードと列の定義にどのような種類のデータ構造を使用したいですか? これは、特定のユースケースに合わせてカスタマイズする必要があるかなり特殊なクラスのようです。

私が作成した PHP クラスは、基本的にあなたが探していることを実行しますが、システムで使用する他のクラスに依存しています。使用したいデータ構造のタイプを提供していただければ、それが機能するかどうかを確認して送信できます。

注:以前にこの回答を公共のコンピューターから公開しましたが、私からのものであるとは思われませんでした(ランダムなユーザーとして表示されました)。表示された場合は、'john' からの回答を無視してください。

于 2011-05-04T18:55:51.390 に答える
-1

おそらく、dbase 関数が使用したいものです。これらは OOP ではありませんが、dbase セットで提供される関数に基づいて動作するクラスを構築することはおそらくそれほど難しくありません。

PHP で利用可能な dbase 機能の詳細については、以下のリンクを参照してください。別のシステムにインポートするためのファイルを作成するだけの場合は、これらの関数が機能するはずです。警告に注意を払うようにしてください。主な警告の一部は次のとおりです。

  • インデックスやメモ フィールドはサポートされていません。
  • ロックのサポートはありません。
  • 2 つの Web サーバー プロセスが同時に同じ dBase ファイルを変更すると、データベースが破損する可能性が非常に高くなります。

http://php.net/manual/en/book.dbase.php

于 2011-04-28T16:23:33.470 に答える
-1

申し訳ありませんが、直接的なクラスについてはお手伝いできません。これを行うものを見たことがありますが、どこで申し訳ないのか思い出せませんが、コーダーが構築するのは簡単なはずです。

だから私は例でこの作品を見た:

PHPはデータを読み込みます

次に、php はフラグ (例: $_GET['type']) を使用して、データの出力方法を認識します。例: Printer、HTML、Excel

したがって、各バージョンのテンプレート ファイルを作成し、フラグに応じて、定義済みのテンプレートを読み込んで使用します。固定幅の場合、これは PHP ではなく HTML であるため、テンプレート CSS で行う必要があります。

次に、これから、ユーザーが必要とする方法でデータを出力できます。

Smarty Templates はこれに非常に適していて、必要に応じてコンテンツ タイプを送信するための php ヘッダーが適しています。

于 2011-05-26T13:29:44.947 に答える