固定幅レコードを具体的に処理する 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);
}
お役に立てれば!