バッチ処理の基本といえば、ファイル入出力。
最近は、DBアクセスが基本となっているが、システム間連携などは、未だにファイル連携が多い。
連携されてきたファイルを直接取り込んでも良いけど、あまりにも格好悪いファイルは、事前にある程度整えておきたい。
そんな時に、バッチ処理が役立つ。
私がよく使い言語は、下記の4つ。それぞれの言語で、1つのファイルを読んで、1つのファイルを出力する雛形を置いておく。
1.pythonの場合(最近は、pythonでチョチョっと加工することが多いかも)
1 2 3 4 5 6
| import codecs
with codecs.open('in.txt', 'r', 'utf_8') as r, codecs.open('out.txt', 'w', 'utf_8') as w:
counter = 0
for line in r:
counter += 1
w.write('{:03d}:{}'.format(counter, line)) |
とても簡潔に、描きたいロジックだけを書くことができます。
2.javaの場合(Javaで作らないと実行の承認が通らない時はJavaで作ります)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import java.lang.String;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.io.BufferedReader;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.nio.file.StandardOpenOption;
public class FileIo {
public static void main (String[] args ) {
try (
BufferedReader r = Files. newBufferedReader(
Paths. get("in.txt"), StandardCharsets. UTF_8);
Writer w = Files. newBufferedWriter(
Paths. get("out.txt"), StandardCharsets. UTF_8,
StandardOpenOption. WRITE,
StandardOpenOption. APPEND,
StandardOpenOption. CREATE)
) {
String line = null;
int counter = 0;
while((line = r. readLine()) != null) {
counter ++;
w. write(String. format("%03d:%s\n", counter, line ));
}
} catch (Exception e ) {
e. printStackTrace();
}
}
} |
昔に比べれば、だいぶシンプルに書けるようにはなったけど、冗長な感じがする。
しかし、実行速度は結構速い。Java7以降は性能をほとんど気にせずコーディングしても、それなりのスピードで動いてくれる。
3.C#の場合(実行環境がWindowsの場合はC#で作ればだいたい動く)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| using System;
using System.Text;
using System.IO;
public class FileIo
{
public static void Main ()
{
try
{
using(StreamReader r = new StreamReader ("in.txt", Encoding .GetEncoding("UTF-8")))
using(StreamWriter w = new StreamWriter ("out.txt", false, Encoding .GetEncoding("UTF-8")))
{
int counter = 0;
while(r .Peek() >= 0)
{
counter ++;
w .WriteLine(string.Format("{0:000}:{1}", counter, r .ReadLine()));
}
}
}
catch (Exception e )
{
Console .Write(e .StackTrace);
}
}
} |
Visual Studioがなくても、気合いでC#を簡単なテキストエディタでコーディングして、
.Net Framework付属のcscでコンパイルし実行できます。
特別な環境がなくても動くあたりは素晴らしい。
4.perlの場合(ファイル入出力はやっぱり速い。Pythonでは性能が出ない時はperlで実装)
1 2 3 4 5 6 7 8 9 10
| use strict ;
open my $r, '<:encoding(utf8)', 'in.txt';
open my $w, '>:encoding(utf8)', 'out.txt';
my $counter = 0;
while (<$r>) {
$counter++;
printf $w "%03d:%s", $counter, $_;
}
close $r;
close $w; |
perlもシンプルに書けて良い。ただし、最近のredhatはperlがインストールされていない
こともあるので、必ずインストールされているPythonでツールを作ることが多くなった。
perl実行環境は、WindowsでもLinuxでもOracleがインストールされていると、その中に大概入っている。
そのperl実行環境を利用するのも良い。Oracleインストール領域に入っているので、perlからOracleに接続してDB操作するのも簡単。
python,java,c#はcloseの心配がない構文が用意されているのが良い。
perlはcloseを明示的に行う必要がある。
python,perlは目的のロジックに集中してコーディングができる。
Java,C#は定義部分が多くて。
VisualStudioやEclisepに頼って簡単にコーディングできたとしても、
メイン処理以外が多いのは、後から読んだ人にとってもメンテナンスしづらいかも。
同じタグの記事
同じカテゴリの記事