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