CSVファイルの読み込み


WILLDO  2010-02-15 06:54:13  No: 37626

エクセルをCSVファイルにしたものを、Delphiで読み込んで、フォーム上にあるそれぞれのTEDITに反映させるやり方を探しています。もし知っていましたら、教えてもらえないのでしょうか?delphi6です。


Kenny  2010-02-15 08:37:47  No: 37627

フォームにButton1とEdit1とEdit2を貼り付けて、Button1のonClickイベントを

procedure TForm1.Button1Click(Sender: TObject);
var SL, SL2: TStringList;
begin
  SL:=TStringList.Create;
  try
    SL2:=TStringList.Create;
    try
      SL.LoadFromFile('どこかのファイル.CSV');  //望みのCSVファイルを指定
      SL2.CommaText:=SL.Strings[0]; //何行目のデータを読むかを指定
      Edit1.Text:=SL2.Strings[0];   //何列目のデータを読むかを指定
      Edit2.Text:=SL2.Strings[1]    //何列目のデータを読むかを指定
    finally
      SL2.Free
    end
  finally
    SL.Free;
  end
end;

こんな風にできます。一度試してみてください。


jazzin  2010-02-16 00:28:38  No: 37628

補足ですが、CommaTextで扱えるのは正確にはSDFという形式です。
これはカンマ以外にスペースなども区切り文字としているため、

123 456,789 10

という文字列を入れると

sl[0] = 123
sl[1] = 456
sl[2] = 789
sl[3] = 10

と解釈されてしまいます。
これを回避するにはダブルクォテーションで文字列を囲えば良いのですが、
("123 456","789 10"のように)
Excelが出力するCSVは(当たり前ですが)SDFではなくCSVですので、
ダブルクォテーションなしで出力されてしまいます。
データの中にスペースを含むことが想定される場合は、
CommaTextを使用することでバグの元となりますので注意が必要です。


Kenny  2010-02-16 02:17:56  No: 37629

jazzinさん、フォローありがとうございます。スペース区切りのこと完全に忘れていました。
Excel2003だと、数値にしろ文字にしろ、" "でくくってくれるのは値の中にカンマ「,」が
含まれているときだけでしたね。

安直に回避するには、
  if Pos(' ', SL.Strings[0])<>0 then
    SL.Strings[0]:=StringReplace(SL.Strings[0], ' ', '  ', [rfReplaceAll]);
とやって半角スペースを全角スペースにしてしまえば逃げられますけど、格好悪い。さてどうしましょう。


jazzin  2010-02-16 03:11:43  No: 37630

ExtractStringsとAnsiDequotedStrの組み合わせでどうでしょうか。
単にスペース区切りを回避するだけならExtractStringsでも良いのですが、

ExtractStrings([','], [], '123 456,"789"" 10"', sl);

といった文字列を処理した場合に、

sl[0] = 123 456
sl[1] = "789"" 10"

となってしまうので、これをAnsiDequotedStrに通すことで、

sl[0] = 123 456
sl[1] = 789" 10

このように正しい結果が得られます。


ほえほえ  2010-02-16 03:13:35  No: 37631

つ https://www.petitmonte.com/bbs/answers?question_id=2926


Kenny  2010-02-16 11:01:07  No: 37632

そもそものCommatextの動作を見ようと思ってClasses.pasのSetDelimitedTextを見ていましたら、
#1から#32まで全部区切り文字なんですね。
#1から#31はCSVファイルには入力できないでしょうから(本当か?)、ソース中の「' '」を全部#31に
変えたら、これでいけそうですね。
と思って、ほえほえさんの書き込みリンクを見たら、くりりんノコトカー!さんの方法がそれでした。(^^;


へ?  2010-02-17 14:07:19  No: 37633

どこが一緒なんだ…?
わざわざ置き換えなんかする意味が分からない
自分で矛盾したこと言ってるのに気付いてるか?
それに制御文字にはタブが含まれてるんだが、普通は入力できないとでも?


KHE00221  2010-02-17 18:38:40  No: 37634

http://khe00221.image.coocan.jp/index.php?FrontPage%2FUnit%2FCSVUtilsUnit.pas

とか

http://khe00221.image.coocan.jp/index.php?FrontPage%2FComponent2%2FCSV


Kenny  2010-02-17 19:36:48  No: 37635

へ?さん>
すみません、Excelの出力するCSVファイルでも、制御文字は埋め込めるんですね。気が付きませんでした。

KHE00221さん>
いつもありがとうございます。よく勉強してみます。


DELPON  2010-02-18 04:00:26  No: 37636

Delphi2006以降なら「StrictDelimiter」が便利
https://www.petitmonte.com/bbs/answers?question_id=6420


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








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