こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Objective-c 改行コードによる文字列の分割方法について

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

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

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

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

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

投稿日時 - 2008-01-29 14:48:04

QNo.3724672

すぐに回答ほしいです

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

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

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ではまた状況が異なるかもしれません。)

投稿日時 - 2008-02-05 02:33:29

お礼

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

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

投稿日時 - 2008-02-05 08:33:12

ANo.5

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

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

このサンプルコードでほぼ目的は達成出来ると思います。

投稿日時 - 2008-02-03 17:04:40

お礼

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

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

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

投稿日時 - 2008-02-03 17:36:16

ANo.3

改めて調べたら、こんな情報がありました。(参考URLを参照)

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

参考までに、NSStringにおける改行コードの扱いに関して以下のような情報がありました。
http://www.drycarbon.com/marimo/index.rb?room=droom;memo=Objective-C+%3A+NSString

参考URL:http://homepage.mac.com/mkino2/cocoaProg/Foundation/NSString/NSString.html

投稿日時 - 2008-02-03 14:01:06

お礼

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

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

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

投稿日時 - 2008-02-03 15:43:19

ANo.2

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

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

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

投稿日時 - 2008-02-02 12:28:08

お礼

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

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

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

投稿日時 - 2008-02-02 21:44:31

ANo.1

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

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

投稿日時 - 2008-01-29 16:11:53

補足

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

よろしくお願いします。

投稿日時 - 2008-01-29 21:58:43

お礼

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

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

投稿日時 - 2008-01-29 21:57:53

あなたにオススメの質問