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

这就是你要找的吗?

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
  1. 您确定不能直接从源中获取此数据吗?一个数据库可能吗?
  2. 没有其他可用的格式?

否则,我应该说正则表达式应该可以为您省去解析这些行的很多麻烦。您可以轻松提取所需的字段,无需循环和条件处理。

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

于 2013-04-05T15:18:26.173 回答
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 回答
0

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

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

如果有很多字段,您可以查看支持固定宽度文件的平面文件阅读器包之一(即JRecordFlatworm + 许多其他的)。在这种情况下,它们可能是矫枉过正

这是所提供文件的略微更改版本(如果原始列表准确,某些字段已嵌入 CR/New Line/Tab 字符。CR/New Line 字符会使阅读更加困难)。

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 回答