• ベストアンサー

改行コードから改行コードまでをスプリットして配列に取り込む方法を教えて

改行コードから改行コードまでをスプリットして配列に取り込む方法を教えてください。 ファイル「sample.txt」の中に 文字列A 文字列B 文字列C 文字列D 文字列E 文字列F 文字列G と書かれていたとします。このファイルを開き、配列@listに @list = 文字列A\r\n文字列B\r\n文字列C\r\n,文字列D\r\n文字列E\r\n,文字列F\r\n文字列G\r\n となるようなコードを教えてください。 要は二重改行コード\r\n\r\nをスプリッタとして複数の行を配列に取り込む方法です。 よろしくお願いします。

  • Perl
  • 回答数5
  • ありがとう数15

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

  • ベストアンサー
  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.5

Windowsの場合、テキストモードだと、\r\n ⇒ \nの自動変換がなされてしまうので、その場合はNo.2さんのコードでopen時に:rawを指定すればいいと思います。 open my $fh, '<:raw', $file or die "$!:$file"; No.2さんのコードでは最後の文字列に二重改行が付いてしまいますが、質問文のように改行を1つだけにしたいならば、 chomp @list; とすればいいと思います。 splitにこだわるならば、 my @list = split /(?<=\r\n)\r\n/, do{ local $/; <$fh> }; でいけると思います。

reglus
質問者

お礼

なるべく簡単に1行で済ませたかったのでsplitしました。 ありがとうございます。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

まあ, カブっちゃうのはしょうがないですが>#3. 少なくとも Windows なら $/ = ''; で十分ですけどね.

reglus
質問者

お礼

お礼を失念しておりました。 ありがとうございます。

回答No.3

かぶった

reglus
質問者

お礼

そのようですねw

回答No.2

use strict; use warnings; use Data::Dumper; my $file = shift || 'data.txt'; open my $fh, '<', $file or die "$!:$file"; my @list = (); { local $/ = "\x0D\x0A\x0D\x0A"; @list = <$fh> }; close $fh or die "$!:$file"; print Dumper(@list);

reglus
質問者

お礼

お礼を失念しておりました。 ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

$/ を適当に設定すればいいだけのような気がする.

reglus
質問者

お礼

お礼を失念しておりました。 ありがとうございます。

関連するQ&A

  • splitの逆関数

    $textに"A,B,C,D"という文字列があったとして、 次に配列@eigoに @eigo=split(/,/, $text)という操作をすると[A B C D]という4つの要素の配列になりますよね。 では、逆に、@eigo_2という[E F G H]という要素4つの配列があったとして、 それを要素ごとに「,」で区切った文字列$text_2="E,F,G,H"に変えることは可能でしょうか? よろしくお願いします。

    • ベストアンサー
    • CGI
  • アクセスでのインポート時の改行について

    現在テキストデータで 文字列A〈tab〉文字列B〈tab〉文字列C〈tab〉文字列D〈改行〉 文字列E〈tab〉文字列F〈tab〉文字列G〈改行〉 : : というファイルがあります。 これをアクセスにインポートするときに、 文字列A  文字列B        文字列C        文字列D 文字列E  文字列F        文字列G : : ※文字列B・C・DおよびF・Gはそれぞれひとつのセル内改行です。 という形でインポートすることは可能でしょうか? もちろんインポートのときでなくても後の加工でこの形になればそれでもいいのですが、いかんせん数が多いのですべてを手入力するのは不可能なのです。 一行あたりの文字列の数は上の例のように4つだったり、3つだったりするのですが、セル内改行にしなければいけないのは左から2つめ以降のセルだけです。 どなたか教えていただけませんでしょうか?

  • 無名配列をsplitする方法

    データベースから吐き出した数百行のデータがあります。それを無名配列に入れているのですが、 1)1列目の一行目を変数に格納したい。 2)7行目を全部足して、その結果を変数に格納したい。 コードが会社にあるため、十分に説明できなければすみません。 一部分でもヒントがございましたら教えてくださいまし。 eval column bind{} #dbh 処理完了 while sth hashref_array() { #無名配列へ格納 my $z = $a->[3]; #一行前のデータを使用 my $b = $z / 12; my $c = $a->[4];  my $d = ($z / $c)**0.38888888; $a=[$x, $b, $c, $d, $e, $f, $g]; }

  • 改行コードについて

    改行コードがよく解らないので説明お願いします 様々なサイトの改行コードの説明で LinuxはLF MacはCR WindowsはCRLFと説明しています 私の認識では LF=\n CR=\r CRLF=\r\n だと思っていました ここで疑問なのですが 確かに私の利用した環境ではLinuxの改行コードは\n, Windwosの改行コードは\r\nでした ところがMacの標準のメモ帳(テキストエディット)で文字を入力しても改行コードは\nです 確認方法は od -cというコマンドとfileというコマンドです これはつまりCRではなくLFということですよね? では、なぜ多くのサイトではMacはCRと説明しているのでしょうか? そもそもCR=\rという認識が間違ってるのでしょうか? よろしくお願いします

  • 配列から別の配列の要素を削除する方法

    ある配列array_aに、100件の文字列要素が格納されています。 別の配列array_bには、80件の文字列要素が格納されています。 array_aの要素、array_bの要素共に重複するものはありません。 array_b中に存在する要素はすべてarray_a中にも存在します。 array_aにあり、array_bにはない要素で構成されたarray_cの作り方を教えてください。 例えば $array_a=array("a","b","c","d","e","f","g"); $array_b=array("e","b","d"); なら、 $array_c=array("a","c","f","g") になります。 配列array_aとarray_bは、 $array_b=array("b","b","d"); であったり、 $array_a=array("a","a","b","c","d","e","f","g"); といった「重複する要素を含むパターン」はありません。要素はすべてユニークです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • EXCELで改行しながら文字表示

    セルB1に  「12345678(改行)ABCDEFGH(改行)abcdefgh(改行)09876543」 と表示させたいです。(文字列は例) 半角8文字単位で改行 表示させる元データは、  セルB5=C5&D5&E5&F5     C5=12345678(文字列)     D5=ABCDEFGH(文字列)     E5=ABCDEFGH(文字列)     F5=09876543(文字列)   各々文字列が入力されないこともあります。  (文字が無ければ前詰めですが、できるだけ8文字単位にしたいので   半角スペースを入れたりします。) C5からF5を入力することにより、カーソルをB5にもっていくと 結果としてB1に表示させるというものです。 文字列は*5行のセルだけでなく、8000行くらいあります。 欲をいえば、カーソルがある行のセルB*を表示させることが できればベストです。 (例えば、F4000にカーソルがあれば、B4000の文字を表示する) 宜しくお願いします。

  • [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
  • C# 文字列を改行コードで分割

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

  • 改行コードについて

    ファイルの文字コードは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で開発をしています。 テキストファイルに文字列を出力する際に、改行コードを扱う以下のような場合について、 ①$str='ab\ncd'; ②$str="ab\ncd"; ①の変数の内容を出力すると\nがそのまま出力されます。 ②の変数の内容を出力すると改行されて出力されます。 質問ですが、この二つの違いについては、 ①のときは\nという文字として出力された。 ②のときは改行コードとして出力された。 (バイトコードで見ると、二つのコードは違っている?) という認識で良いのでしょうか。 ご教示いただけますと幸いです。

    • ベストアンサー
    • PHP

専門家に質問してみよう