拆分一行并填充在Java中跳过空白值的数组

时间:2013-12-25 13:28:18

标签: java arrays

我有一个行数组,有点像下面的

以下是示例:

A-NUMBER                      ROUTINF   ACO   AO    L    MISCELL

0-0                                     0           1-20
0-00
0-01                             FDS                3-20
0-02                                    6      7    3-20
0-03                                           4    3-20
1-0                                                      F=PRE
                                                         ANT=3
                                                         NAPI=1
1-1                                                      F=PRE
                                                         ANT=3

我需要通过跳过包含空白值的列并根据列来解析该行并创建一个如下所示的新行

ANUM = 0-0, ACO=0, L=1-20;
ANUM = 0-00;
ANUM = 0-01, ROUTINF=FDS, L=3-20;
ANUM = 0-02, ACO=6, AO=7, L=3-20;
ANUM = 0-03, AO=4,L=3-20;
ANUM = 1-0, F=PRE, ANT=3, NAPI=1;
ANUM = 1-1, F=PRE, ANT=3;

我可以拆分该行,但我的代码无法记住该值属于哪一列以及何时跳过这些值。

String[] splitted = null;
for (Integer i = 0; i < lines.size(); i++) {
        splitted = lines.get(i).split("\\s+");
        for(String str : splitted)
        if(!(splitted.length == 1)){
                anum = splitted[0];
                routinf = splitted[1];
                aco = splitted[2];
                ao = splitted[3];
                l = splitted[4];
         }else {
                miscell = splitted[0];
            }        
         }

4 个答案:

答案 0 :(得分:0)

文件中的列似乎是固定长度的(我没有看到任何其他方法来区分每列)。如果是这种情况,那么我建议使用substring(srat, end)代替split

创建一个类来保存一条记录。

class Record {
    String aNumber,
    List<String> routingf, aco, ao, l, miscell;

    public Record(String aNumber) {
        this.aNumber = aNumber;
        this.routingf = new ArrayList<>();
        // init other lists like above ...
    }

    public void addRoutingf(String routingf) {
        // add only of not null and is not empty trimmed
        if(routingf != null && routiingf.trim().length() > 0) {
            this.routingf.add(routiingf);
        }
    }

    // implement add-methods for other lists like above ...
}

解析每一行时记住最后创建的记录。如果在实际行A-NUMBER中为空,则使用最后创建的记录来存储值,否则创建一个新记录并将其记为last / actual,以便在必要时将其用于即将到来的行。

将所有记录保存在列表中

List<Record> records = new ArrayList<>();

答案 1 :(得分:0)

什么是常见的分隔符?只是分开...你的+此刻将消耗任何数量的空白区域。 \ s {1,4}将它限制在1到4个字符之间。找到适合您数据的正确数字。

答案 2 :(得分:0)

如果您的输入时间在列之间使用一个空格字符(例如制表符),则代码几乎正常

String[] splitted = null;
for (Integer i = 0; i < lines.size(); i++) {
    splitted = lines.get(i).split("\\s");
    if(!(splitted.length == 1)){
            anum = splitted[0];
            routinf = splitted[1];
            aco = splitted[2];
            ao = splitted[3];
            l = splitted[4];
     }else {
            miscell = splitted[0];
        }        
     }
     //print only not empty fields

请注意删除不必要的for循环并将分割字符从\ s +

更改为\ s

答案 3 :(得分:0)

只是一个想法,但您也可以尝试是否有助于在结果中保留空格以定义它所属的列。

lines.get(i).split(yourDelimiter, -1);

如果不知道您的原始文件究竟是什么样子,很难判断这是否有用,但您可以尝试一下。

e.g。如果值始终位于带有空格的拆分字符串中的某个点,则可以轻松判断它属于哪个列并将其提取出来。