Как преобразовать файлы.txt в файлы.xls, используя коды Informix 4GL
У меня вопрос к обсуждению. Я работаю над программами 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). В этом случае любые коды 4gl или любые команды, которые мы можем использовать для открытия текстовых файлов в Microsoft Excel, превосходны. автоматически сразу после запуска программы? если есть идеи, поделитесь пожалуйста со мной... спасибо
2 ответа
Вывод отображается в обычном формате 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
Я генерирую файлы Excel из кода 4GL, записывая XML с помощью progid для Excel ("? Mso-application progid=\"Excel.Sheet\"?), Поэтому Excel открывает его как таковой.
Это похоже на написание HTML из 4GL, вы просто видите HTML-код в файле. Но с Excel вы пишете XML.