dポイントプレゼントキャンペーン実施中!

componentsSeparatedByString:を使って、改行コードでパースしようとしましたが、一つのパターンでしか対応出来ませんでした。

例えば、WindowsなどのExcelのcsvファイルを読み込もうとした場合、そのファイルの改行コードは、"\n" or "\n\r" or "\r" などのパターンがあり、それらのパターンを対応させる方法が見出せません。

どの様な方法でなら、実現出来るのでしょうか?

因みに、現在のコードを抽出すると
NSString*parsedString;
parsedString = [[parsedString componentsSeparatedByString:@"\r"] objectAtIndex:0];

このようなコードで、文字列の最後尾の改行コードを除去しております。

A 回答 (5件)

文字列の末尾の改行コードを取る事が目的であれば、こんな感じでしょうか。



unichar c = [parsedString characterAtIndex:[parsedString length]-1];
if(cが改行コード){
NSString* newStr = [parsedString substringToIndex:[parsedString length]-1];
}
ifの中の判定はいくつかある改行コードそれぞれにマッチするか調べて下さい。
cr+lfと2バイトの改行コードの場合にも対応する場合は、末尾2文字分を調べれば良いでしょう。

ちなみに、C言語では文字列リテラル中の「\n」がどのコードに展開されるかは処理系によります。
Unix系ではlfに、DOS系ではcr+lfに展開される場合が多いようです。
なので、今回のような場合の改行コードの判定には16進数で記述するとうまく行くのではないでしょうか。(ただ、Objective-Cではまた状況が異なるかもしれません。)
    • good
    • 0
この回答へのお礼

何度もご回答いただきまして、誠にありがとうございます。

成る程、早速実験してみます。

お礼日時:2008/02/05 08:33

改行コードの変換は必要ないです。


先ほど紹介したサイトHMDTの「1 行づつ substring を取り出す」によると、NSStringクラスのsubstringWithRange:メソッドで、どの改行コードにも対応してくれるみたいですよ。

このサンプルコードでほぼ目的は達成出来ると思います。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

このサイトは、参考にしました。
確かに、「1 行づつ substring を取り出す」事は出来ますが、文字列の最後尾には「取り出した時の文字コードの状態」がパースされずに出力されます。仕方ないので、
parsedString = [[parsedString componentsSeparatedByString:@"\r"] objectAtIndex:0];
としました。

説明不足でした。スミマセン。

お礼日時:2008/02/03 17:36

改めて調べたら、こんな情報がありました。

(参考URLを参照)

> 多分、改行コードを調べる方法ですと、処理時間が掛かりますので
んー、そんなにかかりますか?
少なくともnkfで処理するよりは、少ない時間ですむはずですよ。
また、nkfは標準では入ってないので別途インストールする必要もあります。

参考までに、NSStringにおける改行コードの扱いに関して以下のような情報がありました。
http://www.drycarbon.com/marimo/index.rb?room=dr …

参考URL:http://homepage.mac.com/mkino2/cocoaProg/Foundat …
    • good
    • 0
この回答へのお礼

お手間を掛けまして、スミマセン。
参考URLを、読みました。

参考URLにも書いてありましたが、「テキスト読み込み時に全ての改行をLFに変換し、ユーザによる入力も逐次LFに変換して対処している。」と云う事から、どうやら、文字列をパースする前にNSDataなどで改行コードの解析を行う必要がありそうですね。nkf擬きを、作る事になるのかぁ・・・・・。

nkfに関しては、「標準では入ってない」と云う事を見落としてました。失礼しました。

お礼日時:2008/02/03 15:43

1回のcomponentsSeparatedByString: 送信ですべての改行コードに対応したいと言う事でしょうか。



このメソッドではseparatorに1つの文字列しか指定出来ないので、そのままでは出来ません。
改行コードの混在がないという前提条件があれば、文字列をパースして最初の改行コードを調べ、それをseparatorに指定すれば良いでしょう。

混在する場合も分割したい場合は、今回調べた限りでは該当するメソッドがなかったので、自分で分割するしかないような気がします。
    • good
    • 0
この回答へのお礼

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

> 1回のcomponentsSeparatedByString: 送信ですべての改行コードに対応したいと言う事でしょうか。
いいえ。改行コードの混在はなく、改行コードの種類が多岐にわたる場合の質問でした。

 そういった意味では、simi5さんの回答は、的を射ているかもしれません。唯、もう少し詳しく説明して頂ければ、幸いに思います。
多分、改行コードを調べる方法ですと、処理時間が掛かりますので、error発生時にはLinux系で使うシステム命令で
system(nkf -unix org.csv temp.csv);    ← (使えるかは、不明)
として、文字列を置き換えた方が有効なのでしょうか?

お礼日時:2008/02/02 21:44

Objective-Cについては素人ですが、CSVの改行コードはCRLFでなければならないというのが建前です。



参考URL:http://www.ietf.org/rfc/rfc4180.txt

この回答への補足

例え話に関してですが、例え悪かったかもしれませんので、違う言い方にします。
テキストファイルのフォーマットに於いての改行コードは幾つかあり、"CR+LF","CR","LF"等があると思います。それらを対応させる方法を、教えて下さい。

よろしくお願いします。

補足日時:2008/01/29 21:58
    • good
    • 0
この回答へのお礼

早速、ご回答を戴きまして有り難うございます。

知らなかった。(^^;
参考にさせて頂きます。

お礼日時:2008/01/29 21:57

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