改行付きCSVファイルの取り込み

解決


たいぞう  2006-06-05 06:53:21  No: 22013

1レコード内に項目に改行コードが入っていると
"A","B
","C","D"
ようなデータを1レコードとして取り込むのに苦労してます
項目にデータがなく改行コードのみ入ってるのもあり
"A","B","
","D","E"


たいぞう  2006-06-05 06:59:02  No: 22014

追加です。
Readln すると改行コードが入っているため切れてしまいます。
文字コードでレコードの終わりを探してるんですがうまくいきません。
Excel はうまく取り込んでくれるのですが・・・


ん?  2006-06-05 17:40:52  No: 22015

むかし、どっかでレスしたけど思い出せないし、みつからない。
たぶん、これで改行コード入りが読み込める。

  TStringListEx =class(TStringList)
  protected
    procedure SetTextStr(const aValue: String); override;
  end;

implementation

procedure TStringListEx.SetTextStr(const aValue: String);
var
  pChrs, rowStart: PChar;
  rowString: String;
  breakChar: Boolean;
begin
  {更新開始}
  BeginUpdate;
  try
    Clear;
    pChrs := Pointer(aValue);
    if pChrs <> nil then  begin
      while pChrs^ <> #0 do begin
        {行開始}
        rowStart := pChrs;
        breakChar := not (pChrs^ in [#0, #$0A, #$0D]);
        while breakChar do begin
          if pChrs^ = '"' then begin
            {引用符付き文字列を引用符なし文字列に変換して取得(pChrsのアドレスを進める)}
            AnsiExtractQuotedStr(pChrs, '"');
          end
          else begin
            Inc(pChrs);
          end;
          breakChar := not (pChrs^ in [#0, #$0A, #$0D]);
        end;
        SetString(rowString, rowStart, pChrs - rowStart);
        {追加}
        Add(rowString);
        if pChrs^ = #$0D then Inc(pChrs);
        if pChrs^ = #$0A then Inc(pChrs);
      end;
    end;
  finally
    {更新終了}
    EndUpdate;
  end;
end;


たいぞう  2006-06-06 03:08:41  No: 22016

ん?さんありがとうございます。
やり方はちょっと違いますが文字コードを判別して
うまく取り込めました。


ぺけぽん  2006-06-06 09:03:25  No: 22017

どのように解決されたのかを、詳しく提示していただけるとみなさんのためにもなると思います。

ちなみに、項目に「"」が入っている場合でもいけますか?

"A","BE"F
","C","D"


たいぞう  2006-06-07 06:36:20  No: 22018

CSVファイルで
"A","BE"F
","C","D"
のデータは実際あるんでしょうか?
"BE"F
"
の部分です。
これだと私のやり方だとうまくいかないかも・・・
,と"の文字コードを拾ってつなげたのですが・・・


ぺけぽん  2006-06-08 07:29:48  No: 22019

>のデータは実際あるんでしょうか?
>"BE"F
>"
用途が分からないのでなんとも言えませんが、上記のパターンも考えられるということを言いたかっただけです。
データの中に「"」が入る可能性が絶対ないということであれば別ですが。


Basser  2006-06-08 19:02:28  No: 22020

>>のデータは実際あるんでしょうか?
>>"BE"F
>>"
>用途が分からないのでなんとも言えませんが、上記のパターンも考えられる>ということを言いたかっただけです。
>データの中に「"」が入る可能性が絶対ないということであれば別ですが。

括りがおかしいので不正データでいいんじゃないでしょうか?


FAN  2006-06-08 19:24:39  No: 22021

http://www.rfc-editor.org/rfc/rfc4180.txt

   7.  If double-quotes are used to enclose fields, then a double-quote
       appearing inside a field must be escaped by preceding it with
       another double quote.  For example:

       "aaa","b""bb","ccc"

てなわけでCSVとして不正です。
エスケープされた"を読むのであればこんなのどうでしょう。
http://freeandnil.ifdef.jp/csv.pas


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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