0

議論すべき質問がありました。私は INFORMIX 4GL プログラムに取り組んでいます。そのプログラムは、出力テキスト ファイルを生成します。これは、出力の例です。

 Lot No|Purchaser name|Billing|Payment|Deposit|Balance|                
 J1006|JAUHARI BIN HAMIDI|5285.05|4923.25|0.00|361.80|                 
 J1007|LEE, CHIA-JUI AKA LEE, ANDREW J. R.|5366.15|5313.70|0.00|52.45| 
 J1008|NAZRIN ANEEZA BINTI NAZARUDDIN|5669.55|5365.30|0.00|304.25|     
 J1009|YAZID LUTFI BIN AHMAD LUTFI|3180.05|3022.30|0.00|157.75|        

その出力テキスト ファイル (.txt) ファイルから、Excel (.xls) ファイルから手動で開くことができます。この場合、Microsoft Excel でテキスト ファイルを開くために使用できる 4gl コードまたはコマンドです。プログラムを実行した直後に自動的に?何かアイデアがあれば、私と共有してください...ありがとう

4

2 に答える 2

1

表示されている出力は、通常の Informix UNLOAD 形式であり、パイプをフィールド間の区切り文字として使用しています。Excel でこれに最も近い方法は、カンマ区切りの値を含む CSV ファイルです。その出力からそれらのいずれかを生成するのは少し面倒です。コンマを含むフィールドは二重引用符で囲む必要があります。パイプの代わりにコンマを使用する必要があります。また、バックスラッシュについても心配する必要があるかもしれません。

I4GL で変換する方が簡単なのか、それともプログラムを使用して変換するのかは、議論の余地があります。私は後者だと思うので、数年前にこのスクリプトを書きました:

#!/usr/bin/env perl
#
# @(#)$Id: unl2csv.pl,v 1.1 2011/05/17 10:20:09 jleffler Exp $
#
# Convert Informix UNLOAD format to CSV

use strict;
use warnings;
use Text::CSV;
use IO::Wrap;

my $csv = new Text::CSV({ binary => 1 }) or die "Failed to create CSV handle ($!)";
my $dlm = defined $ENV{DBDELIMITER} ? $ENV{DBDELIMITER} : "|";
my $out = wraphandle(\*STDOUT);
my $rgx = qr/((?:[^$dlm]|(?:\\.))*)$dlm/sm;

# $csv->eol("\r\n");

while (my $line = <>)
{
    print "1: $line";
    MultiLine:
    while ($line eq "\\\n" || $line =~ m/[^\\](?:\\\\)*\\$/)
    {
        my $extra = <>;
        last MultiLine unless defined $extra;
        $line .= $extra;
    }
    my @fields = split_unload($line);
    $csv->print($out, \@fields);
}

sub split_unload
{
    my($line) = @_;
    my @fields;
    print "$line";

    while ($line =~ $rgx)
    {
        printf "%d: %s\n", scalar(@fields), $1;
        push @fields, $1;
    }
    return @fields;
}

__END__

=head1 NAME

unl2csv - Convert Informix UNLOAD to CSV format

=head1 SYNOPSIS

unl2csv [file ...]

=head1 DESCRIPTION

The unl2csv program converts a file from Informix UNLOAD file format to
the corresponding CSV (comma separated values) format.

The input delimiter is determined by the environment variable
DBDELIMITER, and defaults to the pipe symbol "|".
It is not assumed that each input line is terminated with a delimiter
(there are two variants of the UNLOAD format, one with and one without
the final delimiter).

=head1 EXAMPLES

Input:

  10|12|excessive|cost \|of, living|
  20|40|bou\\ncing tigger|grrrrrrrr|

Output:

  10,12,"excessive","cost |of, living"
  20,40,"bou\ncing tigger",grrrrrrrr

=head1 RESTRICTIONS

Since the csv2unl program does not know about binary blob data, it
cannot convert such data into the hex-encoded format that Informix
requires.
It can and does handle text blob data.

=head1 PRE-REQUISITES

Text::CSV_XS

=head1 AUTHOR

Jonathan Leffler <jleffler@us.ibm.com>

=cut
于 2013-10-29T04:13:15.637 に答える
0

Excel progid ("?mso-application progid=\"Excel.Sheet\"?) を使用して XML を記述して 4GL コードから Excel ファイルを生成するので、Excel はそれをそのように開きます。

4GL から HTML を書くのと同じように、HTML コードをファイルに書き込むだけです。しかし、Excel では XML を記述します。

于 2015-01-02T17:14:19.570 に答える