从多列文本文件中提取某些值

时间:2013-04-04 23:49:56

标签: java

假设我有一个这样的文本文件:

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 个答案:

答案 0 :(得分: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()]);

答案 1 :(得分:0)

你的代码将退出while循环@第一行,不以“AK”开头 你应该更换
while((strLine = br.readLine())!= null&amp;&amp; strLine.startsWith(“AK”))
            {
            list.add(strLine中);
            }

while((strLine = br.readLine())!= null)
            {
            如果(strLine.startsWith( “AK”))
            list.add(strLine中);
            }

答案 2 :(得分:0)

这看起来更像固定宽度文件(特定位置中的字段)或固定宽度文件上的某些变量。在这种情况下,您可以使用substr函数来获取字段(请注意,您还应测试字符串长度):

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

如果有很多字段,您可以查看其中一个支持固定宽度文件的平面文件阅读器包(例如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

答案 3 :(得分:0)

  1. 您确定无法直接从源获取此数据吗?数据库可能吗?
  2. 没有其他格式?
  3. 否则,我应该说正则表达式可以为你解决这些问题带来很多麻烦。您可以轻松地提取所需的字段,而无需循环和条件处理。

    然而,有智者曾经说过,当有人试图用正则表达式解决问题时,他现在有2个问题。