27

/etc/passwdJavaでLinuxファイルを解析しようとしています。私は現在、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 日前でもない:異なるプラットフォームで終わる異なる行の背後にある歴史的な理由

編集

原作者からの注意:

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

4

5 に答える 5

57

ウィキペディアから:

  • 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、Microsoft Windows、Symbian OS
  • CR: Commodore マシン、Apple II ファミリー、バージョン 9 までの Mac OSおよび OS-9

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

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

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

于 2009-01-08T23:04:20.847 に答える
11

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

System.getProperty("line.separator")
于 2009-01-09T02:57:51.750 に答える
4

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

編集「スキャン」Javaチュートリアルの状態:

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

これらのデフォルトを変更するには、useDelimiter() メソッドを使用できます。

于 2009-01-08T23:16:22.383 に答える
1

これは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(); }
  }
}
于 2009-01-08T23:23:00.077 に答える
0

なぜ使用しないのLineNumberReaderですか?

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

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

それでも、一度に 1 行ずつ読み取るには、 を使用するのはやり過ぎのように思えますScanner

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

于 2009-01-08T23:06:48.207 に答える