• ベストアンサー

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

componentsSeparatedByString:を使って、改行コードでパースしようとしましたが、一つのパターンでしか対応出来ませんでした。 例えば、WindowsなどのExcelのcsvファイルを読み込もうとした場合、そのファイルの改行コードは、"\n" or "\n\r" or "\r" などのパターンがあり、それらのパターンを対応させる方法が見出せません。 どの様な方法でなら、実現出来るのでしょうか? 因みに、現在のコードを抽出すると NSString *parsedString; parsedString = [[parsedString componentsSeparatedByString:@"\r"] objectAtIndex:0]; このようなコードで、文字列の最後尾の改行コードを除去しております。

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

  • ベストアンサー
  • simi5
  • ベストアンサー率71% (5/7)
回答No.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ではまた状況が異なるかもしれません。)

xcode_15
質問者

お礼

何度もご回答いただきまして、誠にありがとうございます。 成る程、早速実験してみます。

その他の回答 (4)

  • simi5
  • ベストアンサー率71% (5/7)
回答No.4

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

xcode_15
質問者

お礼

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

  • simi5
  • ベストアンサー率71% (5/7)
回答No.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
xcode_15
質問者

お礼

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

  • simi5
  • ベストアンサー率71% (5/7)
回答No.2

1回のcomponentsSeparatedByString: 送信ですべての改行コードに対応したいと言う事でしょうか。 このメソッドではseparatorに1つの文字列しか指定出来ないので、そのままでは出来ません。 改行コードの混在がないという前提条件があれば、文字列をパースして最初の改行コードを調べ、それをseparatorに指定すれば良いでしょう。 混在する場合も分割したい場合は、今回調べた限りでは該当するメソッドがなかったので、自分で分割するしかないような気がします。

xcode_15
質問者

お礼

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

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

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

参考URL:
http://www.ietf.org/rfc/rfc4180.txt
xcode_15
質問者

お礼

早速、ご回答を戴きまして有り難うございます。 知らなかった。(^^; 参考にさせて頂きます。

xcode_15
質問者

補足

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

関連するQ&A

  • C# 文字列を改行コードで分割

    C# 文字列を改行コードで分割 テキストボックスに記載された文字列を1行ごとに取り出そうと思い string[] strs = textBox1.Text.Split('\n'); とコーディングしたら、末尾に\rがついてしまいました。 末尾の\rを削除するコードを追加して書けばよいのですが、改行コード\r\nで分割する方法ありましたらお教えください。

  • [iPhone]改行をファイル出力する方法

    [iPhone]改行をファイル出力する方法 改行を含む文字列をファイル出力するにはどうするといいのでしょうか。 ファイル出力をNSString→NSData経由で行なっていますが、改行コード(\n)が改行されず、文字として'\n'が出力されてしまいます。 現在のコードは ------------- NSMutableString* mstr = [[NSAutoreleasePool alloc] init]; for (int i=0; i<3; i++) { NSString* str = [NSString stringWithFormat:@"%@,%@\n",@"aaa", @"bbb"]; [mstr appendString:str]; } NSData* out_data = [mstr dataUsingEncoding:NSUTF8StringEncoding]; [out_data writeToFile:@"/user/test.csv" atomically:YES]; [ファイルの内容] aaa,bbb\naaa,bbb\naaa,bbb\n ------------- '\n'を'\r'や'\n\r'にしても、改行されません。 どの様にコーディングするとよいのでしょうか、宜しくお願いします。

  • 改行コードの除去

    phpでcsvファイルを読み込んで処理しています。 $handle = fopen(ファイル名,"r"); while (!feof($handle)){ $filedata = fgets($handle); $record = explode(",", $filedata); というようにやっているのですが、 ファイルの最終行の改行コードを除去する方法が分からなくて困っています。 何か良い方法は無いでしょうか

    • 締切済み
    • PHP
  • csvファイル改行コードの置換について

    お世話になります。 csvファイルで作成したデータを出力表示させるスクリプトで csvファイル内の改行コード(セル内)以後のデータが出力できません。 下記の置換で改行コード以後のデータが表示されません。 $abc =~ s/\r\n//g; $abc =~ s/\n//g; $abc =~ s/\r//g; csvファイル内の改行の数が多く、1行のデータが改行の為に、2行になったりしているので出力前に置換し表示させる方法です。 csvファイル作成時につく""は正常に置換しています。 似たような質問もあったのですが、少し違うようですので質問いたしました。 何卒、ご教授お願いいたします。

    • ベストアンサー
    • Perl
  • 特定の改行コードだけ削除する

    CSVファイルを変換するPGを書きたいのですが、 変換したいCSVには改行コード\nと\r\nが混在しています。 改行コード\r\nはそのままにして \nだけ削除したいのですが どのように書けばよろしいのでしょうか。 Perlは5.12.2です。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 改行コードについて

    ファイルの文字コードはutf-8で改行コードはLFです。 メール送信時にメール文面の一部にいれるテキストを mysqlに保存しています。 メール送信のソース内でデータを読み込み送信までは できているのですが改行コードを変換したく $msg = str_replace("\r\n", "\n", $msg); とやってみましたが改行されず普通に\r\nと表示され うまく変換ができません。 いろいろと試した結果以下のソースでは正常に改行されました。 $msg = str_replace("\\r\\n", "\n", $msg); メール送信前にデバッグでしてみましたが読み込むデータの 改行部分は\r\nとなっているのは確認済みです。 \を多くつければ改行はできるようなのですがこれは仕様なの でしょうか? またmysqlに入れてあるデータはフォームから入力し登録 しているのですがLFの改行コードは\nなので登録時に\r\nではなく \nと変換してからmysqlに登録するのがいいものなのでしょうか?

    • 締切済み
    • PHP
  • [PHP]csvファイルを生成するときのマックの改行対応の方法について

    [PHP]csvファイルを生成するときのマックの改行対応の方法について 現在、phpでcsvファイルを出力しているのですが、Windowsだと旨く改行が反映されるのですが、Macだと旨く行きません。。。 改行は「\n」を使っていましたが、マックの改行コードが「\r」との事なので、「\n\r」としたのですが、旨く反映されないようです。。。 途中は省きますが $csvData .= "A列" . "," . "B列" . "\n\r"; $csvData .= "a" . "," . "b" . "\n\r"; $csvData .= "c" . "," . "d" . "\n\r"; として、マックでオープンオフィスを使用して開くと、 A列,B列a,bc,d と1行で出て来てしまします。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP5で度忘れしたのですが、文字列の改行コードを削除する方法ですが、

    PHP5で度忘れしたのですが、文字列の改行コードを削除する方法ですが、 1度で "\r\n", "\n", "\r" を削除する方法が知りたいです。 $text = rtrim($text, "\r\n"); $text = rtrim($text, "\n"); $text = rtrim($text, "\r"); を1回で・・・ 話は変わりますが、PHP6はもう普及しているのでしょうか?

    • ベストアンサー
    • PHP
  • 改行コードの変換について

    OS:Solaris2.6 改行コードをunixからms-dosへ、ms-dosからunixへ変換したいと思っています。 ながれとしては、ms-dosで作成したファイルをunixのほうで編集(プログラム) して、再びms-dosに戻すといったことがしたいと思っています。 そこで、 nkf -e aaa | tr '\r\n' '\n' > bbb nkf -e ccc | tr '\n' '\r\n' > ddd aaa:ms-dos ccc:編集後のファイル これでできると思ったのですが、dddの改行コードの表示がE'で Macintoshの改行コードになってしまします。 また、bbbのファイルですが改行が2回行われてしまいます。 例 aaa のファイルの内容 123 456 bbb のファイルの内容 123 456 どのようにすれば、解決できるか教えていただけないでしょうか? お願いします。

  • perlでの改行コードの置換

    perlで改行コードを置換したいのですが・・・ もとのファイルはS-JISコードでその中身をEUC(UNIXで使用するために)に変換します。ここまではOKなのですが、改行コードがうまく行きません。 改行コードをUNIXで使うためにLFだけにしようと思い、 $line =~ s/\r\n/\n/g; (これは\r\nで引っかからない) とか $line =~ s/\n/\x0A/g; とかにしてみたのですがうまく行きません。 どのようにすればよろしいでしょうか?

    • ベストアンサー
    • Perl