• ベストアンサー

Delphi6 Delimiterの使い方

CSVファイルの処理で困っています。 ファイルから1行読んだ後、必要なカラムだけを 取得しようと思っています。 TStrings と DelimitedText を使って カンマで分割してくれるのは便利なのですが、 どうも半角スペースでも分割してしまうようです。 Delimiterプロパティで ',' と指定してるはず なのですが、空白も強制的に分割文字になって しまうんでしょうか? ソースのイメージとしては Var SL: Tstrings; で宣言して begin   ・・・   readln(target, line); { 1行読み込み }   SL := TStringList.Create;   SL.Delimiter := ',';   SL.DelimitedText := line; とやった上で SL[0]とかSL[1]とかで必要なカラムを取得しています。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • honiyon
  • ベストアンサー率37% (331/872)
回答No.2

こんにちは、honiyonです。  お礼ありがとうございます(..  なるほど、CSV側が自動生成では、それに修正加えろ、というのは難しいかも知れませんね...(笑)  では、やはりCommaTextに代わるものを自分で作成する必要があると思います。  下記は何のエラーも想定していない基本的な独自処理のサンプルです。  メモ帳で適当に書いた非テストコードなので、あくまで考え方の参考程度にお願いします(^^;  また、半角カンマを含む文字列の処理は想定していませんのでご注意ください。 procedure SetCSV(var SL:TStringList; line:string); var   i : integer;   ans : string; begin   i := 0;   repeat     if line[i] = ',' then begin  //カンマ文字発見       SL.Add(ans);       ans := '';     end else begin //カンマ以外       ans := ans + line[i];     end;     inc(i);   until (length(line) < i); end;  このコードは、   readln(target, line); { 1行読み込み }   SL := TStringList.Create;   SetCSV(SL,line);  こんな風に使用します。  参考になれば幸いです(..

noname#257070
質問者

お礼

ありがとうございました。 サンプルを参考に自作のコードを作ってみました。 何とか解決ができたようです。 いろいろありがとうございました。

その他の回答 (2)

noname#14464
noname#14464
回答No.3

 TStringsじゃないですが・・・ 拙作、StrToken.pasのPickTokenメソッドならば、スペースを気にせず切り出しが出来ると思います。 String型変数に読み込みたいデータを入れて、それを第一引数に、第二引数に,を指定します。  実行すると、切り出された最初のトークンが戻り値として返り、引数に指定したString型変数の中身が、トークン切り出し後の残り文字列になります。 詳しくは添付サンプルファイルをご覧ください。  下記ページのリンクよりダウンロードできます。

参考URL:
http://takamichie.at.infoseek.co.jp/warehouse/units/index.html
noname#257070
質問者

お礼

ありがとうございました。 サンプルを参考に自作のコードを作ってみました。 何とか解決ができたようです。 いろいろありがとうございました。 Delphiの世界もいろいろサンプルコードがあるんですね。 何となく親切な人が多いジャンルだなぁと感じました。 自分も他の人の役に立てるように頑張ります!

  • honiyon
  • ベストアンサー率37% (331/872)
回答No.1

こんにちは、honiyonです。  文字列が " "で文字が囲まれていれば、正しく処理されます。取り扱おうとしているCSVには、文字列が " で囲まれていないのですね。一応CSVの規定としては、文字列は " "で囲むように指示されています。  ということでCSVに " "を付加すれば解決する問題ですが、それをせずに処理するには、一時的に他の文字に置き換えるか、独自でCSV処理するしかないと思います。  因みにカンマ区切りであれば、 SL.CommaText := line;  で OK です。 Delimiterは、カンマ以外で区切られているケースに対応する場合のみ使用するようにすると、ソースがちょっぴりスッキリするかもです。  参考になれば幸いです(..

noname#257070
質問者

お礼

ご回答ありがとうございました。 そうなんです。文字列が " " で囲われていない ファイルを操作しようとしているんです。 確かに、honiyon さんがおっしゃるとおり、 文字列が囲われていて、カンマ区切りであれば SL.CommaText := line; で済むんですが、そのCSVファイルはとある社内システムから 毎日自動的に生成されてくるので、それを変えるのは困難です。 何か良い方法はありませんか? もしくはサンプルソースなどがあると嬉しいです。 宜しくお願いします。

関連するQ&A