1レコード内に項目に改行コードが入っていると
"A","B
","C","D"
ようなデータを1レコードとして取り込むのに苦労してます
項目にデータがなく改行コードのみ入ってるのもあり
"A","B","
","D","E"
追加です。
Readln すると改行コードが入っているため切れてしまいます。
文字コードでレコードの終わりを探してるんですがうまくいきません。
Excel はうまく取り込んでくれるのですが・・・
むかし、どっかでレスしたけど思い出せないし、みつからない。
たぶん、これで改行コード入りが読み込める。
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;
ん?さんありがとうございます。
やり方はちょっと違いますが文字コードを判別して
うまく取り込めました。
どのように解決されたのかを、詳しく提示していただけるとみなさんのためにもなると思います。
ちなみに、項目に「"」が入っている場合でもいけますか?
"A","BE"F
","C","D"
CSVファイルで
"A","BE"F
","C","D"
のデータは実際あるんでしょうか?
"BE"F
"
の部分です。
これだと私のやり方だとうまくいかないかも・・・
,と"の文字コードを拾ってつなげたのですが・・・
>のデータは実際あるんでしょうか?
>"BE"F
>"
用途が分からないのでなんとも言えませんが、上記のパターンも考えられるということを言いたかっただけです。
データの中に「"」が入る可能性が絶対ないということであれば別ですが。
>>のデータは実際あるんでしょうか?
>>"BE"F
>>"
>用途が分からないのでなんとも言えませんが、上記のパターンも考えられる>ということを言いたかっただけです。
>データの中に「"」が入る可能性が絶対ないということであれば別ですが。
括りがおかしいので不正データでいいんじゃないでしょうか?
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
ツイート | ![]() |