Linuxの_/etc/passwd
_ファイルをJavaで解析しようとしています。現在、 _Java.util.Scanner
_ クラスで各行を読み取り、 Java.lang.String.split(String)
を使用して各行を区切ります。
問題は、次の行です。
_list:x:38:38:Mailing List Manager:/var/list:/bin/sh"
_
スキャナーによって3つの異なる行として扱われます。
list:x:38:38:Mailing
_List
Manager...
_Linuxから取得しなかった新しいファイルにこれを入力すると、Scanner
が適切に解析します。
Linuxの新しい行について私が理解していないことがありますか?
明らかに回避策はスキャナーを使用せずにそれを解析することですが、それはエレガントではありません。誰かがそれを行うためのエレガントな方法を知っていますか?
ファイルをScanner
で動作するファイルに変換する方法はありますか?
2日前でも: 異なるプラットフォームで終わる異なる行の背後にある歴史的な理由
[〜#〜]編集[〜#〜]
原作者からのメモ:
「問題の原因となっている別のエラーがあることがわかりました。質問は無視してください」
から ウィキペディア :
- 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'
'\r'
'\n'
'\n'
スキャナー/パーサーにUNIXバージョンも処理させる必要があります。
現在のOSの標準行末は次の場所から取得できます。
System.getProperty("line.separator")
スキャナーがスペースで壊れています。
[〜#〜]編集[〜#〜]: 'スキャン' Javaチュートリアル 状態:
デフォルトでは、スキャナーは空白を使用してトークンを区切ります。 (空白文字には、空白、タブ、および行末記号が含まれます。完全なリストについては、Character.isWhitespaceのドキュメントを参照してください。)
UseDelimiter()メソッドを使用して、これらのデフォルトを変更できます。
これは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(); }
}
}
'\ n'以外のすべての非表示文字を削除しようとしましたか。行を分割するために使用している正規表現は何ですか?
LineNumberReader
を使用してみませんか?
それができない場合、コードはどのようになりますか?
私が考えることができる唯一の違いは、あなたが悪い正規表現で分割していることと、ファイルを自分で編集すると、どういうわけかあなたの正規表現を通過するdos改行を取得することです。
それでも、一度に1行ずつ読むには、Scanner
を使用するのはやり過ぎのようです。
もちろん、なぜ構文解析しているのか/etc/passwd
は他の議論の穴です:)
今、私はこれらの機会にBufferedReaderを使用する理由を覚えています... :-)