web-dev-qa-db-ja.com

WindowsとLinuxで行末は異なりますか?

Linuxの_/etc/passwd_ファイルをJavaで解析しようとしています。現在、 _Java.util.Scanner_ クラスで各行を読み取り、 Java.lang.String.split(String) を使用して各行を区切ります。

問題は、次の行です。

_list:x:38:38:Mailing List Manager:/var/list:/bin/sh" 
_

スキャナーによって3つの異なる行として扱われます。

  1. _list:x:38:38:Mailing_
  2. List
  3. _Manager..._

Linuxから取得しなかった新しいファイルにこれを入力すると、Scannerが適切に解析します。

Linuxの新しい行について私が理解していないことがありますか?

明らかに回避策はスキャナーを使用せずにそれを解析することですが、それはエレガントではありません。誰かがそれを行うためのエレガントな方法を知っていますか?

ファイルをScannerで動作するファイルに変換する方法はありますか?


2日前でも: 異なるプラットフォームで終わる異なる行の背後にある歴史的な理由

[〜#〜]編集[〜#〜]

原作者からのメモ:

「問題の原因となっている別のエラーがあることがわかりました。質問は無視してください」

18
jbu

から ウィキペディア

  • LF:Multics、UnixおよびUnixライクなシステム(GNU /Linux、AIX、Xenix、Mac OS X、FreeBSDなど)、BeOS、Amiga、RISC OS、その他
  • CR + LF:DEC RT-11および他のほとんどの初期の非Unix、非IBM OS、CP/M、MP/M、[〜#〜] dos [〜#〜]、OS/2、MicrosoftWindows、Symbian OS
  • CR:コモドールマシン、Apple IIファミリ、バージョン9までのMac OSおよびOS-9

私はこれをこれらの行末に翻訳します 一般的に

  • ウィンドウズ: '\r\n'
  • Mac(OS 9-):'\r'
  • Mac(OS 10以降):'\n'
  • Unix/Linux:'\n'

スキャナー/パーサーにUNIXバージョンも処理させる必要があります。

47
Michael Haren

現在のOSの標準行末は次の場所から取得できます。

System.getProperty("line.separator")
10
Chase Seibert

スキャナーがスペースで壊れています。

[〜#〜]編集[〜#〜]'スキャン' Javaチュートリアル 状態:

デフォルトでは、スキャナーは空白を使用してトークンを区切ります。 (空白文字には、空白、タブ、および行末記号が含まれます。完全なリストについては、Character.isWhitespaceのドキュメントを参照してください。)

UseDelimiter()メソッドを使用して、これらのデフォルトを変更できます。

4
Kevin Haines

これはUbuntuで私のために働きます

import Java.util.Scanner;
import Java.io.File;

public class test {
  public static void main(String[] args) {
    try {
      Scanner sc = new Scanner(new File("/etc/passwd"));
      String l;
      while( ( l = sc.nextLine() ) != null ) {
        String[] p = l.split(":");
        for(String pi: p) System.out.print( pi + "\t:\t" );
        System.out.println();
      }
    } catch(Exception e) { e.printStackTrace(); }
  }
}
1
nEJC

'\ n'以外のすべての非表示文字を削除しようとしましたか。行を分割するために使用している正規表現は何ですか?

0
J.J.

LineNumberReaderを使用してみませんか?

それができない場合、コードはどのようになりますか?

私が考えることができる唯一の違いは、あなたが悪い正規表現で分割していることと、ファイルを自分で編集すると、どういうわけかあなたの正規表現を通過するdos改行を取得することです。

それでも、一度に1行ずつ読むには、Scannerを使用するのはやり過ぎのようです。

もちろん、なぜ構文解析しているのか/etc/passwdは他の議論の穴です:)

0
davetron5000

今、私はこれらの機会にBufferedReaderを使用する理由を覚えています... :-)

0
Neil Coffey