亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當不同行在不同位置有空格時如何根據空格分割記錄

當不同行在不同位置有空格時如何根據空格分割記錄

炎炎設計 2023-07-28 09:48:09
我有一個包含如下記錄的文件,我試圖根據空格分割其中的記錄并將它們轉換為逗號。文件:a 3w 12 98 header P6124e 4t 2  100 header I803c 12L 11 437       M12BufferedReader reader = new BufferedReader(new FileReader("/myfile.txt"));String line = reader.readLine();while (line != null) {System.out.println(line);line = reader.readLine();String[] splitLine = line.split("\\s+")如果數據由多個空格分隔,我通常會使用正則表達式替換 ->split('\\s+')或split(" +")。但在上述情況下,我有一條c沒有數據的記錄header。因此,正則表達式“\s+”或“+”將跳過該記錄,我將得到一個空白空間,而c,12L,11,437,M12不是c,12L,11,437,,M12在這種情況下,如何根據任何分隔符正確分割行,以便獲得以下格式的數據:a,3w,12,98,header,P6124e,4t,2,100,header,I803c,12L,11,437,,M12誰能讓我知道如何實現這一目標?
查看完整描述

3 回答

?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

也許您可以嘗試使用更復雜的方法,使用復雜的正則表達式來匹配每行的六個字段,并顯式處理第五個字段缺失值的情況。我重寫了您的示例,添加了一些控制臺日志,以澄清我的建議:


public class RegexTest {

    private static final String Input = "a 3w 12 98 header P6124\n" +

            "e 4t 2  100 header I803\n" +

            "c 12L 11 437       M12";


    public static void main(String[] args) throws Exception {

        BufferedReader reader = new BufferedReader(new StringReader(Input));

        String line = null;

        Pattern pattern = Pattern.compile("^([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+)? +([^ ]+)$");


        do {

            line = reader.readLine();

            System.out.println(line);

            if(line != null) {

                String[] splitLine = line.split("\\s+");

                System.out.println(splitLine.length);


                System.out.println("Line: " + line);

                Matcher matcher = pattern.matcher(line);

                System.out.println("matches: " + matcher.matches());

                System.out.println("groups: " + matcher.groupCount());

                for(int i = 1; i <= matcher.groupCount(); i++) {

                    System.out.printf("   Group %d has value '%s'\n", i, matcher.group(i));

                }

            }

        } while (line != null);

    }

}

關鍵是用于匹配每一行的模式需要六個字段的序列:

  • 對于每個字段,值描述為[^ ]+

  • 字段之間的分隔符描述為+

  • 第五個(可為空)字段的值描述為[^ ]+?

  • 使用括號將每個值捕獲為一個組:( ... )

  • 每行的開始 ( ^) 和結束 ( ) 都被明確標記$

然后,每一行都與給定的模式進行匹配,獲得六個組:您可以使用 訪問每個組matcher.group(index),其中index是從1 開始的,因為group(0)返回完全匹配。

這是一種更復雜的方法,但我認為它可以幫助您解決問題。


查看完整回答
反對 回復 2023-07-28
?
富國滬深

TA貢獻1790條經驗 獲得超9個贊

對可用于分割輸入的空白字符數量進行限制。

對于您的示例數據,最多 5 個有效:

String[]?splitLine?=?line.split("\\s{1,5}");


查看完整回答
反對 回復 2023-07-28
?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

您只是想將分隔符從空格切換為逗號嗎?

在這種情況下: cat myFile.txt | sed 's/   */  /g' | sed 's/ /,/g'

*編輯:添加了一個階段來刪除超過兩個空格的列表,將它們替換為保留雙逗號所需的兩個空格。


查看完整回答
反對 回復 2023-07-28
  • 3 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號