//--------------------------------------------------------------------------- #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); } } //---------------------------------------------------------------------------