エクセルをCSVファイルにしたものを、Delphiで読み込んで、フォーム上にあるそれぞれのTEDITに反映させるやり方を探しています。もし知っていましたら、教えてもらえないのでしょうか?delphi6です。
フォームに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;
こんな風にできます。一度試してみてください。
補足ですが、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を使用することでバグの元となりますので注意が必要です。
jazzinさん、フォローありがとうございます。スペース区切りのこと完全に忘れていました。
Excel2003だと、数値にしろ文字にしろ、" "でくくってくれるのは値の中にカンマ「,」が
含まれているときだけでしたね。
安直に回避するには、
if Pos(' ', SL.Strings[0])<>0 then
SL.Strings[0]:=StringReplace(SL.Strings[0], ' ', ' ', [rfReplaceAll]);
とやって半角スペースを全角スペースにしてしまえば逃げられますけど、格好悪い。さてどうしましょう。
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
このように正しい結果が得られます。
つ https://www.petitmonte.com/bbs/answers?question_id=2926
そもそものCommatextの動作を見ようと思ってClasses.pasのSetDelimitedTextを見ていましたら、
#1から#32まで全部区切り文字なんですね。
#1から#31はCSVファイルには入力できないでしょうから(本当か?)、ソース中の「' '」を全部#31に
変えたら、これでいけそうですね。
と思って、ほえほえさんの書き込みリンクを見たら、くりりんノコトカー!さんの方法がそれでした。(^^;
どこが一緒なんだ…?
わざわざ置き換えなんかする意味が分からない
自分で矛盾したこと言ってるのに気付いてるか?
それに制御文字にはタブが含まれてるんだが、普通は入力できないとでも?
http://khe00221.image.coocan.jp/index.php?FrontPage%2FUnit%2FCSVUtilsUnit.pas
とか
http://khe00221.image.coocan.jp/index.php?FrontPage%2FComponent2%2FCSV
へ?さん>
すみません、Excelの出力するCSVファイルでも、制御文字は埋め込めるんですね。気が付きませんでした。
KHE00221さん>
いつもありがとうございます。よく勉強してみます。
Delphi2006以降なら「StrictDelimiter」が便利
https://www.petitmonte.com/bbs/answers?question_id=6420
ツイート | ![]() |