2016-10-04 8 views
1

私はこのサイトを頻繁に頻繁に使用しますが、私は答えが見つからないことがあります。これは他のいくつかの記事と似ていますが、私が探しているものに対する答えは見つかりませんでした。.txtファイルの文字列を2次元配列に読み込みます。引用符で囲まれたスペースを無視する。使用するのはJDK

これは学校のコースの一部であり、現在のところ、これはもっと大きなJavaプロジェクトのスタンドアロンのJavaクラスです。現在、私は.txtファイルを編集することができません、とONLY次のリソース使用するように制限しています:

john.doe 108de81c31bf9c622f76876b74e9285f "dead man" user 
jane.doe 3e34baa4ee2ff767af8c120a496742b5 "dead woman" admin 
barney.rubble a584efafa8f9ea7fe5cf18442f32b07b "secret password" mod 
fred.flinstone 17b1b7d8a706696ed220bc414f729ad3 "R0ck3y business" user 
luke.skywalker 3adea92111e6307f8f2aae4721e77900 "usetheforce1234" mod 
leah.skywalker 0d107d09f5bbe40cade3de5c71e9e9b7 "saveme" admin 

各エントリ:次のリストを使用して

標準JDK資源

java.util.Scanner; 
java.io.FileInputStream; 
java.io.IOException; 

をタブで区切られています。

私が持っている現在のJavaコードは、次のとおりです。 のJohn.Doe 108de81c31bf9c622f76876b74e9285f "デッド 男" 期待

user 
jane.doe 
3e34baa4ee2ff767af8c120a496742b5 
"dead 

woman" 
admin 
barney.rubble 
a584efafa8f9ea7fe5cf18442f32b07b 

"secret 
password" 
mod 
fred.flinstone 

17b1b7d8a706696ed220bc414f729ad3 
"R0ck3y 
business" 
user 

luke.skywalker 
3adea92111e6307f8f2aae4721e77900 
"usertheforce1234" 
mod 

public static void main(String[] args) throws IOException { 
    FileInputStream credFile = null;   // File input 
    Scanner inFS = null;      // Scanner object 

    final int NUM_ROWS_CRED = 6; 
    final int NUM_COLS_CRED = 4; 
    String[][] credArray = new String[NUM_ROWS_CRED][NUM_COLS_CRED]; 
    int i = 0;         // Index variable 
    int j = 0;         // Index variable 

    // Import file data from file.txt 
    credFile = new FileInputStream("file.txt"); 
    inFS = new Scanner(credFile); 

    // Create array of file.txt 
    for (i = 0; i < NUM_ROWS_CRED; ++i) { 
     for (j = 0; j < NUM_COLS_CRED; ++j) { 
      credArray[i][j] = inFS.next(); 
     } 
    } 

    // Output array to verify array stored correctly. 
    for (i = 0; i < NUM_ROWS_CRED; ++i) { 
     for (j = 0; j < NUM_COLS_CRED; ++j) { 
      System.out.println(credArray[i][j] + " "); 
     } 
     System.out.println(""); 
    } 

    credFile.close(); //Closes file. 
}       

私の現在の出力は次のようになります出力: john.doe 108de81c31bf9c622f76876b74e9285f 「dead man」 ユーザー

jane.doe 
3e34baa4ee2ff767af8c120a496742b5 
"dead woman" 
admin 

等...

ソリューションズ、指導、右方向へのポインタはすべて歓迎。また、.txtファイルを編集しないようにしっかりと縛られており、JDKと3つのリソースしか使用されていないことに注意してください。ありがとうございました。

+0

'\ t'の行全体を分割しようとしましたか? –

+0

'inFS.next();'は次の空白まで読み込みます。他の解決策では、 –

+0

の引用符を使用する他の正規表現で分割することは、Scanner.useDelimiter()が許可されていることは安全です(java.util.Patternへの依存性のために除外されます)。区切り文字は '[\\ t]'(タブの文字にマッチするパターン)になります。引用符で囲まれた3番目のフィールドにあるタブ文字を除外する正規表現区切り文字を作成する方法があるかどうかはわかりませんしかし、 –

答えて

0

あなたが正規表現によく知られていますか?彼らはあなたの質問を解決する鍵です。

@ cricket_007が既にコメントされているように、デフォルトのScannerの区切り文字は空白です。だからこそスキャナは引用されたトークンを分割してしまいます。これはスキャナがしたくないものです。したがって、入力トークンを分割する方法をスキャナに知らせる必要があります。

行内では、トークンはタブ文字で区切られ、行は改行で区切られます。したがって、スキャナに次のように指示することができます。

inFS.useDelimiter("[\\t\\R]"); 

このようにして、スキャナは引用されたトークン全体を指定します。この正規表現は、が、タブ文字で区切られたトークンを分割するか、改行()で分割することを意味します。Pattern Javadoc

何の改行を入力してがない場合、正規表現は単純です:正規表現の使用が許可されていない場合には

inFS.useDelimiter("\\t"); 

、あなたが引用されたトークンを処理するための別の方法を把握する必要があります。

+0

ありがとうあなたはあなたの答えです。私はあなたが提案したことを試みましたが、私はそれを正しく行ったかどうかはわかりません。 「コンパイルできないソースコード - 誤ったsym型:javautil.Scanner.useDelimeter.next」というエラーが表示されます。私が 'credArray [i] [j] = inFS.useDelimeter(" [\\ t \\ R ")。next();' –

+0

@BrandonPを試したコード行は次のとおりです。 'Scanner'コンストラクタの直下に線を挿入してください – nandsito

+0

このようにしますか? 'inFS =新しいスキャナ(credFile); inFS.useDelimiter( "\\ t"); ' 私はそれらが2つの別々の行にあることを約束します....しかし、ここでは改行をまだ理解できません。 @BrandonP。 –

0

これを試してください。

final int NUM_ROWS_CRED = 6; 
final int NUM_COLS_CRED = 4; 
String[][] credArray = new String[NUM_ROWS_CRED][NUM_COLS_CRED]; 
Pattern pat = Pattern.compile("\"[^\"]+\"|\\S+"); 
try (BufferedReader r = Files.newBufferedReader(Paths.get("file.txt"))) { 
    for (int i = 0; i < NUM_ROWS_CRED; ++i) { 
     Matcher m = pat.matcher(r.readLine()); 
     for (int j = 0; m.find() && j < NUM_COLS_CRED; ++j) 
      credArray[i][j] = m.group(); 
    } 
} 
for (String[] row : credArray) 
    System.out.println(Arrays.toString(row)); 

結果:

[john.doe, 108de81c31bf9c622f76876b74e9285f, "dead man", user] 
[jane.doe, 3e34baa4ee2ff767af8c120a496742b5, "dead woman", admin] 
[barney.rubble, a584efafa8f9ea7fe5cf18442f32b07b, "secret password", mod] 
[fred.flinstone, 17b1b7d8a706696ed220bc414f729ad3, "R0ck3y business", user] 
[luke.skywalker, 3adea92111e6307f8f2aae4721e77900, "usetheforce1234", mod] 
[leah.skywalker, 0d107d09f5bbe40cade3de5c71e9e9b7, "saveme", admin] 
+0

この素晴らしいコードを私に提供していただきありがとうございます。残念ながら、私の教授は、パターンはカバーされていないので、私はそれを使用することができないと通知しました。残念ながら、これまで私の欲求不満でした。 @BrandonP。 –

+0

[Java Scanner - 引用符がない限りスペースで区切る](http://stackoverflow.com/questions/12360694/java-scanner-delimit-by-spaces-unless-quotation-marks-are-present) – saka1029

関連する問題