昨日見た夢を教えて下さい

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]とかで必要なカラムを取得しています。

宜しくお願いします。

A 回答 (3件)

こんにちは、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);
 こんな風に使用します。

 参考になれば幸いです(..
    • good
    • 0
この回答へのお礼

ありがとうございました。

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

お礼日時:2004/12/17 00:30

 TStringsじゃないですが・・・


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

 下記ページのリンクよりダウンロードできます。

参考URL:http://takamichie.at.infoseek.co.jp/warehouse/un …
    • good
    • 0
この回答へのお礼

ありがとうございました。

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

Delphiの世界もいろいろサンプルコードがあるんですね。
何となく親切な人が多いジャンルだなぁと感じました。

自分も他の人の役に立てるように頑張ります!

お礼日時:2004/12/17 00:32

こんにちは、honiyonです。



 文字列が " "で文字が囲まれていれば、正しく処理されます。取り扱おうとしているCSVには、文字列が " で囲まれていないのですね。一応CSVの規定としては、文字列は " "で囲むように指示されています。
 ということでCSVに " "を付加すれば解決する問題ですが、それをせずに処理するには、一時的に他の文字に置き換えるか、独自でCSV処理するしかないと思います。


 因みにカンマ区切りであれば、

SL.CommaText := line;

 で OK です。 Delimiterは、カンマ以外で区切られているケースに対応する場合のみ使用するようにすると、ソースがちょっぴりスッキリするかもです。


 参考になれば幸いです(..
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

そうなんです。文字列が " " で囲われていない
ファイルを操作しようとしているんです。

確かに、honiyon さんがおっしゃるとおり、
文字列が囲われていて、カンマ区切りであれば

SL.CommaText := line;

で済むんですが、そのCSVファイルはとある社内システムから
毎日自動的に生成されてくるので、それを変えるのは困難です。

何か良い方法はありませんか?
もしくはサンプルソースなどがあると嬉しいです。
宜しくお願いします。

お礼日時:2004/12/15 00:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報