C++ Builder 10.2 Tokyo > CSV 문자열 > (")을 추가하는 함수 | (")를 제거하는 함수

운영 환경
RAD Studio 10.2 Tokyo Update 3

개요


  • C++ Builder 10.2 Tokyo > 하리포인트 > TStringList > DelimitedText 사용 시 \"는 사라진다

  • JSON 문자열에 문자열 대체를 시도하면 빠져 버렸다." DelimitedText를 사용할 때 사라지기 때문입니다.

    그것을 피하기 위해 구현했다.

    구현



    이번에는 Unit1.cpp에 클래스(CUtilCsv_specialChar)를 추가해 구현했다.

    본래는 1 파일에 복수의 클래스를 넣는 것은 하지 않는다.
    소스 분리하기 전 단계의 상황.

    Unit1.h
    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <System.Classes.hpp>
    #include <Vcl.Controls.hpp>
    #include <Vcl.StdCtrls.hpp>
    #include <Vcl.Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:    // IDE で管理されるコンポーネント
        TMemo *Memo1;
        TButton *Button1;
        void __fastcall Button1Click(TObject *Sender);
    private:    // ユーザー宣言
    public:     // ユーザー宣言
        __fastcall TForm1(TComponent* Owner);
    };
    
    class CUtilCsv_specialChar
    {
    public:
        static String __fastcall putEachItemBetweenChars(String csvStr, char specialChar);
        static String __fastcall removeCharsFromEachItem(String csvStr, char specialChar);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Unit1.cpp
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include <memory>
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
        Memo1->Lines->Clear();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        String srcstr = L"\"AAA\",\"BBB\",\"CCC\"";
    
        Memo1->Lines->Add(srcstr);
    
        String wrk = srcstr;  // 作業用
    
        wrk = CUtilCsv_specialChar::removeCharsFromEachItem(wrk, '"');
        Memo1->Lines->Add(wrk);
    
        wrk = CUtilCsv_specialChar::putEachItemBetweenChars(wrk, '"');
        Memo1->Lines->Add(wrk);
    }
    
    /*static*/String __fastcall CUtilCsv_specialChar::putEachItemBetweenChars(String csvStr, char specialChar)
    {
        std::unique_ptr<TStringList> wrkSL(new TStringList);
        wrkSL->StrictDelimiter = true;
        wrkSL->Delimiter = ',';
        wrkSL->DelimitedText = csvStr;
    
        String res = L"";
        for(int idx=0; idx < wrkSL->Count; idx++) {
            if (res.Length() > 0) {
                res += L",";
            }
            res += String(specialChar) + wrkSL->Strings[idx] + String(specialChar);
        }
        return res;
    }
    
    /*static*/String __fastcall CUtilCsv_specialChar::removeCharsFromEachItem(String csvStr, char specialChar)
    {
        String res = StringReplace(csvStr, String(specialChar), L"", TReplaceFlags()<<rfReplaceAll);
        return res;
    }
    //---------------------------------------------------------------------------
    

    실행 예





    첫 번째 줄: 원래 문자열
    두 번째 줄 : double quotation을 제거한 후
    세 번째 줄 : double quotation을 넣은 후

    좋은 웹페이지 즐겨찾기