ダブルクォーテーシォンを削除したい

解決


AS  2018-03-08 02:07:16  No: 49042

こんばんは。
最近、質問が続いていますが、よろしくお願いします。

日本語の前後についている””を削除すると文字化けします。
文字化けしないように削除する方法はありませんか??

  repeat
    k:=pos('"',s);
    if k>0 then Delete(S,k,length('"'));
  until k=0;

"こんばんは"→こんばんは

ウィンドウズ8,10で、XE5です。


igy  2018-03-08 02:24:34  No: 49043

StringReplace 関数を使うのは、いかがですか?

S := StringReplace(S, '"', '', [rfReplaceAll]);


AS  2018-03-08 03:50:58  No: 49044

igyさん、ありがとうございます。
早速、試してみます。


通りすがり  2018-03-08 04:46:52  No: 49045

S := S.DeQuotedString(");
でどうでしょう?


igy  2018-03-08 06:48:12  No: 49046

質問を見直してみると、最初に挙げたコード自体、実行しても文字化けしないような気が・・・


通りすがり  2018-03-08 18:52:58  No: 49047

実は
var
  S: AnsiString;
だったりして…


Mr.XRAY  2018-03-08 22:31:17  No: 49048

環境が書いてないので,
「最近よく質問しているのだから,調べればわかるでしょう」
と言ってような気がしたので調べました.

Delphi XE5 をお使いのようですので.

procedure TForm1.Button1Click(Sender: TObject);
var
  LText : string;
begin
  LText := '"日本語"';
  LText := AnsiDequotedStr(LText, '"');
  ShowMessage(LText);
end;

動作確認は Windows 7 U64(SP1) + Delphi XE5(UP2) Pro です.
このぐらいのコードなら,省略しないで,全部書いてもバチは当たらないと思いますが.
あっ,そうか.何万行のプログラムの一部だから省略したコードが提示できないんですね (笑)


Mr.XRAY  2018-03-08 22:43:23  No: 49049

>日本語の前後についている””を削除すると文字化けします。

引用符の一種で「ダブルクォーテーション」と言います.
用語を知らないと検索もできませんし,会話もスムーズにいかないことがあります.
もちろん " で検索してもおそらく意味を知ることはできるのではないかと思います.


AS  2018-03-09 04:30:01  No: 49050

皆さん、ありがとうございます。
私の知人が、Mr.XRAYさんのHPを見て作ってくれてましたので、
ここに紹介しておきます。

  Enc := TEncoding.GetEncoding(CP_UTF8);
  S1 := TStringList.Create;
  try
    S1.LoadFromFile(FileName,Enc);
    for i := 0 to S1.Count-1 do
    begin
      Stocks1[i]:=S1[i];
      S:= Stocks1[i];
      while pos('"',S) >0 do
      begin
        J := pos('"',S);
        Delete(S,J,Length('"'));
      end;
      Stocks1[i]:=S;
      filecut(15,Stocks1[i]);
      for j:=1 to 15 do Stocks2[i,j]:=cutf[j];
    end;
    StocksNo:= S1.Count-1;
  finally
    Enc.Free;
    S1.Free;
  end;


AS  2018-03-09 04:34:19  No: 49051

私が実行したところでは、最初のコードでも、memo1上では文字化けしません。
保存しても、それを読み込んでも文字化けしません。
ただ、変数に読み込むと文字化けして困っていたのです。

私がコードを早く上げておけば、皆さんにご迷惑をおかけしなくて良かったのですが、
解決だけではと思っています。


AS  2018-03-09 04:50:19  No: 49052

Mr.XRAYさんへ

今回は環境書いていますよ。
””は読み方は分かりますよ。
この問題は何万行のプログラムの一部ではありません。
それの補助用の208行のプログラムです。

とにかく、今回はmemo1上では異常はなく、保存して読み込んでも異常がなく、
なので、苦労しました。
XRAYさんのお蔭です、ありがとうございました。


AS  2018-03-09 04:52:22  No: 49053

質問の綴りが間違っていましたね??


igy  2018-03-09 06:08:42  No: 49054

最初の質問では、

> 日本語の前後についている””を削除すると文字化けします。 

だったのが、

> ただ、変数に読み込むと文字化けして困っていたのです。 

になってますね。

どうも、問題の切り分けが必要なようです。

> 私の知人が、Mr.XRAYさんのHPを見て作ってくれてましたので、 
> ここに紹介しておきます。 

コードの一部の紹介ではなく、
文字化け が発生するコード(他の人でも再現可能なコード) を
ASさん自身で作成して、ここに挙げてみるのは、いかがですか?


AS  2018-03-09 06:38:46  No: 49055

文字化けの質問した時は、自分のプログラムで外して文字化けが起こっていたのです。

その後、memo1上で試してみて、何で?と。
igyさんに紹介されたreplaceもmemo1上で試してみて、何で?と。
いろいろ試して、読み込むときに文字化けするという事実に。

知人に作ってもらったプログラムもあるのでいいかと??
諦めました。

  memo1.Lines.LoadFromFile(filename);
  s:=memo1.Text;
  S := StringReplace(S, '"', '', [rfReplaceAll]);
  memo1.Text:=S;
  memo1.Lines.SaveToFile(filename);

自作のfilerでこの保存したのを読み込んでも、文字化けは起こしていません。
しかし、上の修正前の読み込み方法では文字化けするんですよ。

最初から””のついていないfileを読み込んだら、文字化けは起こりません。
外したのと比較すると、memo1上では全く同じに見えます。

encを使ったので文字化けが消えたのだと思いますが、何故??という疑問は
残っています。


AS  2018-03-09 06:58:24  No: 49056

””のついたファイルを無理やりエクセルにと見込んだら””が消えたデータを
表示します。
それを保存したら、””のないファイルができます。
これを修正前の読み込み法で変数に読み込んだら、正常に読み込みます。

先に書いた方法で無理に消すと、表面上は全く変わらないのに、
修正前の読み込み法で変数に読み込んだら文字化けします。

ということで、相当悩みましたが、まあ文字化けは消えてるのでいいか
と諦めてるわけです。


AS  2018-03-09 07:05:48  No: 49057

変更後のと比べると、ENCを使ってない、tryを使ってない
とこくらいだと思います。
よろしくお願いします。

procedure FileGet(S:string);
var
  FileName,InBuff:string;
  F:textfile;
  j,i:integer;
begin
  FileName := S;
  if not FileExists(FileName) then
  begin
      showmessage(FileName+'が見つかりません');
       exit;
  end ;
  AssignFile(F, FileName); Reset(F);
  i:=0;
  repeat
    inc(i);   readln(F,InBuff); St1[i]:=Inbuff;
    filecut(5,inbuff);
    for j:=1 to 5 do St2[i,j]:=cutf[j];
  until eof(f);
  StNo:=i;
  CloseFile(F);
end;


igy  2018-03-09 07:21:23  No: 49058

> 変更後のと比べると、ENCを使ってない、tryを使ってない 
> とこくらいだと思います。 
> よろしくお願いします。 

これ、他の人の環境では、コンパイルでエラーが出ますし、文字化けの再現方法もわかりませんよね。

繰り返しになりますが、
文字化け が発生するコード(他の人でも再現可能なコード) を 
ASさん自身で作成して、ここに挙げてみるのは、いかがですか?


AS  2018-03-10 02:04:56  No: 49059

上に書いたコードを完全にコンパイルできるようにしてほしいという意味でしょうか??
それとも、エラーの出るデータを作って欲しいという意味しょうか?

文字化けするデータは、VBなどで文字列をcsvファイルとして保存したらできますが、
私は今VB勉強中なので、提示は出来ません。

コンパイル可能なコードは今から作って後で、書き込みます。

では、では。


AS  2018-03-10 03:17:40  No: 49060

作りました。
よろしくです。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FileGet(S:string);
    procedure FileCut(v:integer; b:String);

  private
    { Private 宣言 }

  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;
  St:array[1..9999,1..15] of string;
  CutF:array of string;
  StNo:integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  S,s1,FileName : string;
  i,J,K:integer;
begin
  Filename:=Edit1.text;
  memo1.Lines.LoadFromFile(filename);
  s:=memo1.Text;
  S := StringReplace(S, '"', '', [rfReplaceAll]);
  memo1.Text:=S;
  memo1.Lines.SaveToFile(filename);
  showmessage('もう一度LoadFromFileで読み込みます。');
  memo1.Lines.LoadFromFile(filename);

  showmessage('分解しながら読み込んで繋ぎ合わせます。');
  memo1.Lines.clear;

  FileGet(filename);
  for I :=1 to StNo do
  begin
    s1:='';
    for j:=1 to 5 do s1:=s1+St[i,j]+',';
    memo1.lines.add(S1);
  end;
end;

procedure Tform1.FileGet(S:string);
var
  FileName,InBuff:string;
  F:textfile;
  j,i:integer;
begin
  FileName:=S;
  if not FileExists(FileName) then
    begin
      showmessage(FileName+'が見つかりません');
       exit;
    end ;
  AssignFile(F, FileName); Reset(F);
  i:=0;
  repeat
    inc(i);   readln(F,InBuff);
    filecut(5,inbuff);
    for j:=1 to 5 do St[i,j]:=cutf[j];
  until eof(f);
  StNo:=i;
  CloseFile(F);
end;

procedure Tform1.FileCut(v:integer; b:String);
var
  i,j:integer;
  q:string;
begin
  q:=b+',';
  setlength(CutF,v+1);
  for i:=1 to v do
    begin
     j:=pos(',',q);
     CutF[i]:=Copy(q,0,j-1);
     q:=copy(q,j+1,length(q)-j);
     if (q='') and (i<>V) then exit;
    end;
end;
end.


igy  2018-03-10 04:09:24  No: 49061

> 上に書いたコードを完全にコンパイルできるようにしてほしいという意味でしょうか?? 

いいえ。違います。

> それとも、エラーの出るデータを作って欲しいという意味しょうか? 

問題を解決したいのであれば、
文字化けやエラーが再現できる必要最小限のコードを(必要ならデータも)、ここに挙げれば、
この掲示板を見ている人も検証できて解決につながるということです。

> 文字化けするデータは、VBなどで文字列をcsvファイルとして保存したらできますが、 

エラーを起こすと思われる 検証用のCSVファイルを、テキストエディタとかで書いたり、できそうな気もしますけど。


通りすがり  2018-03-10 06:19:33  No: 49062

AssignFileとか古いファイルIO関数は使わないのでアレなのですが、AssignFileとかReadLnってUTF-8をきちんと
扱えるんでしたっけ?ANSI専用だったような記憶が…


igy  2018-03-10 07:00:24  No: 49063

ASさんが書いた内容が、わかりにくかったのですが、

> 私の知人が、Mr.XRAYさんのHPを見て作ってくれてましたので、 
> ここに紹介しておきます。 

これは、
  ASさんの知人が作成した UTF-8のファイルを正しく読めるプログラムを、問題の箇所と置き換えて、解決した。
という意味だったのですね。

ということで、

> コードの一部の紹介ではなく、 
> 文字化け が発生するコード(他の人でも再現可能なコード) を 
> ASさん自身で作成して、ここに挙げてみるのは、いかがですか? 

は、不要でしたね。失礼しました。

> AssignFileとかReadLnってUTF-8をきちんと 扱えるんでしたっけ?

たぶん、これですね。原因は。

UTF-8のファイルを読み込むことは、ASさんの知人が作った、

>  Enc := TEncoding.GetEncoding(CP_UTF8); 

の箇所で判明しましたが、ファイルがUTF-8という情報は、
質問の最初にでも書いていたら、解決が早かったかもですね。


AS  2018-03-10 07:02:15  No: 49064

通りすがりさんへ

古いプログラムが残っていて、それを使う続けているので、
こうなっています。
ただ、普通のファイルは読み込めますよ。

ブロックリードは危険だという警告が出ていますが、使い続けています。
変え方が分からないんですよね。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加