如何从txt文件中读取Java中的2个特定列?

时间:2018-01-19 08:10:03

标签: java delimiter file-handling

如何从.txt文件中读取2个特定列(第1列和第3列)。列由不同的分隔符分隔(我想忽略第2列,其中(基数为16) 写的)。另外我如何跳过列标题。 .txt文件如下所示:

IOU/AB-L                                                    Organization                                 
company_id                                                  Organization                                 
                                                            Address                                      

D0-AB-DB   (hex)             Ahenhen ViewAt Technology Co.,Ltd. 
D0ABDB     (base 16)         Ahenhen ViewAt Technology Co.,Ltd. 
                             9A,Microprofit,6th Gaoxin South Road, High-Tech 
                             Industrial Park, Nanshan, henzhen.
                             henzhen  guangdong  51867
                             DN

42-05-F5   (hex)            Integrated Technology (Malaysia) Sdn. Bhd.
4205F5     (base 16)        Integrated Technology (Malaysia) Sdn. Bhd.
                            Phase 1, Bayan Aepas FIZ
                            Bayan Lepas  Penang  11923
                            NY

我正在尝试的代码是:

String line;
BufferedReader reader = new BufferedReader(new FileReader(path));
while ((line = reader.readLine()) != null)
{
    String[] parts = line.split("   ", 3);
    if (parts.length >= 3)
    {
        String key = parts[0];
        String value = parts[2];
        System.out.println("Key value pair is "+key+"   "+value);
    } 
}

所以基本上我想在第一行读取D0-AB-DBAhenhen ViewAt Technology Co.,Ltd.,然后在第二行读取42-05-F5Integrated Technology (Malaysia) Sdn. Bhd.

有人可以建议一些编辑吗?
在这种情况下我应该使用什么正则表达式?

提前致谢!

2 个答案:

答案 0 :(得分:1)

您可以在split方法中使用“\ s +”而不是“”来用空格来剪切字符串

我很确定你会在这里找到你想要的东西: https://docs.oracle.com/javase/8/docs/api/index.html?java/util/StringTokenizer.html

答案 1 :(得分:0)

他们的关键是分开至少2个空格 \s{2,},使用分割限制为4,并使用布尔值来知道你是否已通过标题,或忽略细节线:

boolean passedHeader = false;
boolean skipDetail = false;

String line;
BufferedReader reader = new BufferedReader(new FileReader(path));

while ((line = reader.readLine()) != null) {
    line = line.trim();

    if (!passedHeader) { // skip header
        if (line.isEmpty()) {
            passedHeader = true;
        }
        continue;
    }

    if (skipDetail) { // skip detail
        if (line.isEmpty()) {
            skipDetail = false;
        }
        continue;
    }

    if (line.isEmpty()) { // skip empty lines
        continue;
    }

    String[] parts = line.split("\\s{2,}", 4);

    if (parts.length >= 3) {
        String key = parts[0];
        String value = parts[2];
        System.out.println("Key: \"" + key + "\"   Value: \"" + value + "\"");
    } else {
        System.out.println("Encountered the following line of unexpected format:");
        System.out.println(line);
    }

    skipDetail = true;
}

备注

我重新格式化了控制台输出,添加了双引号以清楚地显示所有内容。

当行的格式出现意外时,我添加了一个else,这可能会发生任何类似于此D0-AB-DB (hex)的行(D0-AB-DB(hex)之间只有一个空格)

以下是分割限制为3且输入行为4列或更多的情况。所有额外的列都包含在第3列的文本中。即具有以下内容:

D0-AB-DB   (hex)             Ahenhen ViewAt Technology Co.,Ltd.       Column 4 text
你会得到:

Key: "D0-AB-DB"   Value: "Ahenhen ViewAt Technology Co.,Ltd.       Column 4 text"