//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <Inifiles.hpp> //iniファイルの為に
#include <io.h> //ファイルサイズ取得の為に
#include "cget3Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
//IniFileオブジェクトの作成
//アプリの存在するフォルダに「Dlg.ini」という名前でIniFileを作成
TIniFile* MyIni = new TIniFile(ExtractFilePath(
Application->ExeName)+"Dlg.ini");
OpenDialog1->Filter = "CSVファイル (*.csv)|*.csv|"
"テキストファイル (*.txt *.dat *.log)|*.txt;*.Log;*.dat|"
"全てのファイル (*.*)|*.*";
try{
//IniFile情報を読み取る
//初めて読みこむ場合はカレントディレクトリを表示
OpenDialog1->InitialDir = ExtractFilePath(
MyIni->ReadString("StartDir","Dir",GetCurrentDir()));
OpenDialog1->FileName = ExtractFileName(
MyIni->ReadString("StartDir","Dir",""));
//ユーザーが「開く」をクリックしたら true。
if (OpenDialog1->Execute() == true)
{
Label1->Caption = "このダイアログが消えるまで、お待ち下さい。";
Label1->Update(); //(a)Captionに代入した後に実行する。もしくは(b)へ
if ( Tag == 0 ) {Tag = 1;}
try{
// 使用変数の宣言
ProgressBar1->StepBy(1); //始めに1つ進めて置く。
TStringList *FList = new TStringList();
TStringList *FLenList = new TStringList();
TStringList *FComma = new TStringList();
// ダイアログで選択されたファイル名を FList に入れる
FList->LoadFromFile(OpenDialog1->FileName);
int i;
if ( FList->Count>1000000 ) i = 10000;
else { i = 100; }
ProgressBar1->Min = 0;
ProgressBar1->Max = FList->Count; //最大量
ProgressBar1->Position = 1; //バ―の最初の位置
//0行目から順番に FList を最後まで 読む。
//【IDX は行の数】
for (int IDX = 0;IDX < FList->Count;IDX++)
{
//IDX が マイツール制限 804万行以上は調べず break
if (IDX > 8040000) break;
//もし、行全部が空白なら次行へ CONTINUE
//FList に読み込んだ行内容の半角空白を a に変換してから、
//FCommaのCommaTextに、入れる。
//【 FComma->CommaText 1行分のデ―タ 】
//【 FList->Strings[IDX] 1行分のデ―タ】
FComma->CommaText =
StringReplace(FList->Strings[IDX],
' ',"a",TReplaceFlags() << rfReplaceAll);
//FComma の内容を、0列目から順番に調べる
// IDX2 はセルの位置(列番号)
for (int IDX2 = 0;IDX2 < FComma->Count;IDX2++)
{
// IDX2 が新しい列なら
if (IDX2 > FLenList->Count-1)
{
// FComma に入ってる文字列の長さを取得して FLenList に入れる
FLenList->Add(IntToStr(FComma->Strings[IDX2].Length()));
}
else{
//列番号が FLenList の行数より小さい時
//検査済みのIDX2 番目のセルと同位置のセルの長さを比較
//今調べたフィ―ルドの方が長ければ、
//以前のものと今回のものを置き換える。
if (FComma->Strings[IDX2].Length() >
StrToInt(FLenList->Strings[IDX2]))
{
FLenList->Strings[IDX2] =
IntToStr(FComma->Strings[IDX2].Length());
}
}
} // for の終わり
if (IDX % i ==0) //IDX 100に一回更新する
{
ProgressBar1->StepBy(i); //100行おきに更新しているから。
//タイトルバ―に現在位置を表示
this->Caption = IntToStr(ProgressBar1->Position)+ " / "+(FList->Count)+"行";
Application->ProcessMessages();
}
} //for の終わり
this->Caption = "INIファイル作成中";
Application->ProcessMessages();
//現在選択されているフォルダのパスを書込む。
//次回の表示の際はこのフォルダが使われる。
MyIni->WriteString("StartDir","Dir",OpenDialog1->FileName);
// F行 100byte以上は 100byte にする
for (int IDX4 = 0;IDX4 < FLenList->Count;IDX4++)
{
if (StrToInt(FLenList->Strings[IDX4]) > 99)
FLenList->Strings[IDX4] ="99";
}
//最後の仕上げ
//[Format 0]
MyIni->WriteString("Format 0","F",FLenList->CommaText);
//[Format+1]
for (int IDX3 = 0;IDX3 < FLenList->Count;IDX3++)
{
FLenList->Strings[IDX3] =
StrToInt(FLenList->Strings[IDX3])+1;
}
MyIni->WriteString("Format+1","F",FLenList->CommaText);
MyIni->WriteString("ChoiceFile","File",OpenDialog1->FileName);
try
{
//項目行の分離
TStringList* HeadLine = new TStringList();
HeadLine->Text =(FList->Strings[0]);
HeadLine->SaveToFile(
ExtractFilePath(Application->ExeName)+"\\Temp\\Temp1.csv");
FList->Delete(0);
FList->SaveToFile(ExtractFilePath
(Application->ExeName)+"\\Temp\\Temp.csv");
//処理の終了
ProgressBar1->Position = FList->Count;//バ―の最後の位置
}
catch (Exception &exception) //例外処理
{
Application->ShowException(&exception);
}
//オブジェクトの開放
delete FList;
delete FLenList;
delete FComma;
} //try の終わり
catch (Exception &exception) //例外処理
{
Application->ShowException(&exception);
}
} // if の終わり
else {
//ファイル選択ダイアログでキャンセルしたら
//順番取り
MyIni->WriteString("StartDir","Dir",OpenDialog1->FileName);
MyIni->WriteString("Format 0","F","");
MyIni->WriteString("Format+1","F","");
MyIni->WriteString("ChoiceFile","File","");
}; //else の終わり
//オブジェクトの開放
delete MyIni;
Form1->Close();
} //try の終わり
catch (Exception &exception) //例外処理
{
Application->ShowException(&exception);
}
}
//---------------------------------------------------------------------------