1

次のようなテキスト ファイルがあるとします。

ALASKA             30-DEC-11                                                  
CD  STATION         ICAO  IATA  SYNOP   LAT     LONG   ELEV   M  N  V  U  A  C

AK ADAK NAS PADK  ADK   70454  51 53N  176 39W    4   X     T          7 US

AK AKHIOK           PAKH  AKK 
         56 56N  154 11W   14   X                8 US

AK AMBLER           PAFM  AFM          67 06N  157 51W   88   X                7 US

AK ANAKTUVUK PASS   PAKP  AKP          68 08N  151 44W  642   X                7 US

AK で始まる行を保存することにのみ関心があります。さらに、たとえば STATION 名など、特定の情報を配列に保存する必要があります。

最初の行では、"ADAK NAS" を stationArray に、"51" を "53"、"N"、"176"、"39"、"W" と同じ配列に格納します。AK で始まる行ごとにこれを行います。

私はこれをどうするかについて本当にかなり混乱しています。これに関する私の現在のコードは次のとおりです。

//process text file
FileInputStream fstream = new FileInputStream("file.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;

//add lines that start with "AK" to arraylist
ArrayList list = new ArrayList();
while ((strLine = br.readLine()) != null && strLine.startsWith("AK")) {
    list.add(strLine);
}

Iterator itr;
for (itr=list.iterator(); itr.hasNext(); ) {
    String str = itr.next().toString();
    String [] splitSt =str.split("\\t");
    String junk1 = "\\t";

イテレータ部分をオンラインから取得しましたが、そこで分割する方法や、それぞれの値を配列に入れる方法がわかりません。あなたが提供できる助けをいただければ幸いです。ありがとう!

4

4 に答える 4

0
  1. このデータをソースから直接取得することはできませんか? 多分データベース?
  2. 他の形式は利用できませんか?

それ以外の場合は、正規表現を使用すると、これらの行を解析する手間が大幅に軽減されます。ループや条件処理なしで、必要なフィールドを簡単に抽出できます。

しかし、賢者はかつて、誰かが正規表現を使用して問題を解決しようとすると、2 つの問題が発生すると言いました。

于 2013-04-05T15:18:26.173 に答える
0

これは、固定幅ファイル (特定の位置のフィールド) または固定幅ファイルのバリエーションのように見えます。その場合、substr 関数を使用してフィールドを取得できます (文字列の長さもテストする必要があることに注意してください)。

while ((strLine = br.readLine()) != null) {
    if ( strLine.startsWith("AK") {
       field1 = strLine.substring(.., ..);
       field2 = strLine.substring(.., ..);
         ......
    }
}

多くのフィールドがある場合は、固定幅ファイルをサポートするフラット ファイル リーダーパッケージの 1 つを調べることができます (つまり、 JRecordFlatworm + その他の多くのもの)。この場合、それらはやり過ぎかもしれません

以下は、提供されたファイルのわずかに変更されたバージョンです (元のリストが正確である場合、一部のフィールドには CR / 改行 / タブ文字が埋め込まれています。CR/改行文字により読みにくくなります)。

ALASKA             30-DEC-11                                                  
CD  STATION         ICAO  IATA  SYNOP   LAT     LONG   ELEV   M  N  V  U  A  C

AK ADAK NAS         PADK  ADK   70454  51 53N  176 39W    4   X     T          7 US

AK AKHIOK           PAKH  AKK          56 56N  154 11W   14   X                8 US

AK AMBLER           PAFM  AFM          67 06N  157 51W   88   X                7 US

AK ANAKTUVUK PASS   PAKP  AKP          68 08N  151 44W  642   X                7 US
于 2013-04-05T00:40:04.823 に答える
0

これはあなたが探しているものですか?

List<String> list = new ArrayList<String>();
List<String[]> out = new ArrayList<String[]>();
while ((strLine = br.readLine()) != null && strLine.startsWith("AK"))
{
    list.add(strLine);
}
for(String line : list){
    String[] lineArr = str.split("\\t");

}
for (itr=list.iterator(); itr.hasNext(); )
{
    String delimiter = "\\t";
    String [] splitSt =str.split(delimiter);
    //we don't know how many we're going to find,
    //so we should accumulate the data in a List.
    out.add(splitSt);
}
String[] stationArray = out.toArray(new String[out.size()]);
于 2013-04-05T00:04:41.030 に答える
0

あなたのコードは while ループを終了します @ "AK" で始まらない最初の行
は、
while ((strLine = br.readLine()) != null && strLine.startsWith("AK"))
{
list.追加 (strLine);
によって
_

while ((strLine = br.readLine()) != null)
{
if(strLine.startsWith("AK"))
list.add(strLine);
によって
_

于 2013-04-05T00:08:16.870 に答える