CSVファイルの加工とインポート (1)

  ターゲットは「郵政省」の郵便番号データ



http://www.post.japanpost.jp/zipcode/download.html よりダウンロードします

一般的な「システム」では、郵便番号データを持っています。ここでは、詳細なメンテナンス方法は記述しませんが、少なくとも導入するヒントとしては意味を持つと思います



  必要な項目のみ抽出



「システム」では、郵政省が用意する全てのデータ(列)を必要としません。ですからまず、その為の加工処理を行ないます。これは、テキストファイルの入力と出力のみが発生する「完全なバッチ処理」として作成する為に GUI を使用せずに、Console Application で作成します



  雛形の作成

今後のコンソールバッチのベースとする為に、プロジェクト名は 「BAT」 として下さい プロジェクト名決定後のスケルトンの選択は「簡単な Hello World アプリケーション」を選択します。

コンソールアプリでは、プロジェクトヘッダーが作成されないので BAT.h を作成して以下のようにします

  
#include <lightbox.h>
#include <LboxDatabase.h>

#define START_BLOCK while(1) {
#define END_BLOCK break; }

// グローバル変数:
MyEXTERN BOOL bEnd;
MyEXTERN LboxTool Tool;
MyEXTERN LboxTextFile TxtIn;
MyEXTERN LboxTextFile TxtOut;
MyEXTERN LboxToken Token;
MyEXTERN LboxDatabase *CurDb;
MyEXTERN LboxString *Buff;
MyEXTERN LboxString *Work;
MyEXTERN LboxString *Item;
MyEXTERN LboxString *Column;
MyEXTERN LboxString *Query;
MyEXTERN LboxString *Message;

// このコード モジュールに含まれる関数の前宣言:
void InitProc( void );
void EndProc( void );
void GetMessageString( LPTSTR lpCode );
  



  InitProc

  
#include "stdafx.h"

#define MyEXTERN extern
#include "BAT.h"

// *********************************************************
// 初期処理
// *********************************************************
void InitProc( void )
{
	// 文字列オブジェクト作成
	Buff = new LboxString();
	Work = new LboxString();
	Item = new LboxString();
	Column = new LboxString();
	Query = new LboxString();
	Message = new LboxString();

	// COM 初期化
	CoInitialize( NULL );

	// データベースブジェクト作成
	CurDb = new LboxDatabase();

	// 接続文字列作成
	Tool.ProgramDirectory( Buff->szLboxString );
	Buff->AddBackslash();
	Buff->operator += ( "販売管理.mdb" );
	CurDb->SetConnectString( 1, Buff );
}
  



  EndProc

  
#include "stdafx.h"

#define MyEXTERN extern
#include "BAT.h"

// *********************************************************
// 終了処理
// *********************************************************
void EndProc( void )
{
	delete Buff;
	delete Work;
	delete Item;
	delete Column;
	delete Query;
	delete Message;
	delete CurDb;

	CoUninitialize( );
}
  



  GetMessageString

  
#include "stdafx.h"

#define MyEXTERN extern
#include "BAT.h"

// *********************************************************
// メッセージ取得
// *********************************************************
void GetMessageString( LPTSTR lpCode )
{
	if ( CurDb->pCn->State == adStateClosed ) {
		if ( !CurDb->Connect() ) {
			printf( "%s\n", "データベースの接続に失敗しました");
			return;
		}	
	}	

	// 非存在チェック用 SQL
	Query->operator = (
		"select * from メッセージマスタ "
		" where コード = "
	);
	Work->operator = ( lpCode );
	Work->Enclose( "'" );
	Query->operator += ( Work );
	// 存在する
	if ( CurDb->Query( Query ) ) {
		CurDb->GetText( 1, Message );
	}
	else {
		Message->operator = ( "該当メッセージは存在しません" );
	}

	CurDb->DisConnect();
}
  



  BAT.cpp

Visual Studio 上でデバッグ実行する場合は、プロジェクトの設定の「デバッグ」タブの中の「プログラムの引数」で以下のように指定します

Debug\入力ファイル名.CSV Debug\出力ファイル名.CSV

  
#include "stdafx.h"

#define MyEXTERN
#include "BAT.h"

// *********************************************************
// エントリポイント
// *********************************************************
int main(int argc, char* argv[])
{
	int nRet;
	
	nRet = 0;

	if ( argc != 3 ) {
		printf( "%s\n", "引数に誤りがあります" );
		nRet = 1;
		return nRet;
	}

	InitProc();

	START_BLOCK

		BOOL bRet;

		bRet = TxtIn.ReadOpen( argv[1] );
		if ( !bRet ) {
			printf( "%s\n", "入力ファイルをオープンできませんでした" );
			nRet = 1;
			break;
		}
		bRet = TxtOut.WriteOpen( argv[2] );
		if ( !bRet ) {
			TxtIn.Close();
			printf( "%s\n", "出力ファイルをオープンできませんでした" );
			nRet = 1;
			break;
		}

		int nInCount,nOutCount;
		nInCount = nOutCount = 0;

		Buff->Resize( 10000 );
		while( TxtIn.Get( Buff ) ) {
			nInCount++;
			Token.CreateToken( Buff, "," );
			Work->SetChar( 0, 0 );
			// 郵便番号(7桁)
			Work->operator += (Token.Token[2]);
			Work->operator += (",");
			// 都道府県名(半角カタカナ)
			Work->operator += (Token.Token[3]);
			Work->operator += (",");
			// 市区町村名(半角カタカナ)
			Work->operator += (Token.Token[4]);
			Work->operator += (",");
			// 町域名(半角カタカナ)
			Work->operator += (Token.Token[5]);
			Work->operator += (",");
			// 都道府県名
			Work->operator += (Token.Token[6]);
			Work->operator += (",");
			// 市区町村名
			Work->operator += (Token.Token[7]);
			Work->operator += (",");
			// 町域名
			Work->operator += (Token.Token[8]);
			Work->operator += ("\n");
			TxtOut.Put( Work );
			nOutCount++;
		}

		TxtOut.Close();
		TxtIn.Close();

		printf( "入力件数 = %d\n", nInCount );
		printf( "出力件数 = %d\n", nOutCount );

	END_BLOCK

	EndProc();

	return nRet;
}
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ