【问题标题】:Manipulating Strings in a File Scanner ~ Java在文件扫描器中操作字符串 ~ Java
【发布时间】:2014-02-25 10:13:31
【问题描述】:

我收到了一个文件,其中包含姓名、电话号码、呼入和呼出等列表......就像这样

Adams#Marilyn#8233331109#0#0#01012014#C
Anderson#John#5025559980#20#15#12152013#M
Baker-Brown#Angelica#9021329944#0#3#02112014#C

# 是数据项之间的分隔符,每行的调用状态为最后一项。 我需要知道如何以如下格式在屏幕上显示每个人的信息:

姓名电话呼出上次通话中的通话

玛丽莲·亚当斯​​ (823) 333-1109 0 0 01-01-2104
约翰·安德森 (502) 555-9980 20 15 12-15-2013
当归贝克布朗 (859) 254-1109 11 5 02-11-2014

我必须使用子字符串方法来提取电话号码并添加括号/破折号等...

到目前为止,我的代码看起来像这样 我也是一个初学者Java编码课程....

import java.util.Scanner;
import java.io.*;

public class phonedata2_1 {
    public static void main(String[] args) throws IOException {

        String Phonefile, FirstName, LastName;
        Scanner PhoneScan, fileScan;

        System.out.println("    Name      Phone      Calls Out       Calls In       Last Call           Status");

        fileScan = new Scanner(new File("phonedata.txt"));

        while (fileScan.hasNext()) {
            Phonefile = fileScan.nextLine();

            PhoneScan = new Scanner(Phonefile);
            PhoneScan.useDelimiter("#");

            System.out.println(PhoneScan.next() + " " 
                    + PhoneScan.next() + "\t" 
                    + PhoneScan.next() + "\t"
                    + PhoneScan.next() + "\t" 
                    + PhoneScan.next() + "\t" 
                    + PhoneScan.next() + "\t" 
                    + PhoneScan.next());
        }
        System.out.println("\nTotal outgoing calls for the period: " + "\nTotal incoming calls    for the period: \n");

    }
}

【问题讨论】:

  • 使用正则表达式可以过滤整个文件的内容,得到一个包含标题的多维数组:/((\S*)#){6}(\w)/
  • 请将一个答案标记为正确的答案。

标签: java file substring delimiter


【解决方案1】:

使用正则表达式查找每个“数据段”,然后用 # 作为分隔符将其拆分并打印出来:

    File blub = new File("blub.txt");

    Scanner scanner = null;
    try
    {
        scanner = new Scanner(blub);
    }
    catch (FileNotFoundException e){}


    while(scanner.hasNext("((\\S*)#){6}(\\w)"))
    {
        String buffer = scanner.next("((\\S*)#){6}(\\w)");
        for(String value : buffer.split("#"))
            System.out.print(value + " ");
        System.out.println();
    }

输出:

Adams Marilyn 8233331109 0 0 01012014 C 
Anderson John 5025559980 20 15 12152013 M 
Baker-Brown Angelica 9021329944 0 3 02112014 C 

注意: 您可以使用任何空白字符来分隔输入文件中的每个数据段,因此即使是空格或制表符也可以(或与空行疯狂混合等等)。

为了进一步使用数据:
您可以将数据添加到数组列表中,因为 buffer.split("#") 为您提供了数据段数组,因此您可以通过对每个值的所需更改更轻松地输出它。(或以不同的顺序)

【讨论】:

    【解决方案2】:

    您可以使用.split(String regex) 通过将# 作为分隔符来分割您正在阅读的行。这将产生一个数组,您可以遍历并相应地打印内容。此外,似乎除了第一行之外,所有呼叫数据都以 开头,因此您可以使用 split 两次来解析您的文本文件:

    编辑:看到您的评论后,我也意识到,但是,由于.split() 方法将正则表达式作为参数,这意味着可以轻松解决此问题。我的例子如下:

        String str = "Adams#Marilyn#8233331109#0#0#01012014#C Anderson#John#5025559980#20#15#12152013#M Baker-Brown#Angelica#9021329944#0#3#02112014#C";
        String[] lines = str.split(" ");
        System.out.println("Name\tPhone\tCalls\tOut\tCalls In\tLast Call");
        for(String line : lines)
        {
            String[] lineInfo = line.split("#");
            for(String info : lineInfo)
            {
                System.out.print(info + "\t");
            }
            System.out.println();
        }
    

    我不得不手动添加一些额外的标签,但这是输出:

    Name        Phone       Calls       Out Calls In    Last Call
    Adams       Marilyn     8233331109  0   0           01012014    C   
    Anderson    John        5025559980  20  15          12152013    M   
    Baker-Brown Angelica    9021329944  0   3           02112014    C   
    

    【讨论】:

    • 关于“#C”的事情,我注意到了这一点,但我认为它在数据的末尾,因为你会得到“#C”、“#M”和“#C”对于不同的记录。 #M 有点让我失望,因为它看起来不合适。
    • 对不起,我忘记了#C 和#M 是未接来电的状态。我得到 str.split 的方式更容易,但我必须问你如何在文件中执行它,然后如果你使用的是:new File ("datafile");
    • @user3350626:我对答案进行了一些修改,应该可以解决您的问题。至于从文件中读取它,我建议您使用StringBuilder 读取整个文件,然后,一旦读取,您将对其进行操作。
    【解决方案3】:

    这样的事情应该可以工作。您仍然需要自己对电话号码进行所有操作,但所有数据都将包含在通话信息中,因此您应该可以使用它!

    while (fileScan.hasNext())
        {
            //Get a single record
            Phonefile = fileScan.nextLine();
    
            //Seperate the elements of the record        
            String[] callInfo = Phonefile.split("#");
    
            for(String infoPart: callInfo)
            {
                System.out.print(infoPart+ "\t");
            }
    
            System.out.println()
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 2017-04-09
      • 2011-08-23
      • 2019-10-06
      相关资源
      最近更新 更多