0

我有一个文本文件输入,其中包含如下数据。如何将文本文件中的数据显示为特定格式?

Monday
Jessy
Walking
20 minutes
Matthew
Run
20 minutes
Karen
Jogging
40 minutes
Jessica
Run
12 minutes
Tuesday
Messia
Walking
10 minutes
Matthew
Run
20 minutes
Pete
Run
10 minutes
Carol
Walking
30 minutes

我想将文本文件中的数据显示为这种格式:

Day            Name               Type of exercise           Time
Monday         Jessy              Walking                    20 minutes
               Matthew            Run                        20 minutes
               Karen              Jogging                    40 minutes
               Jessica            Run                        12 minutes 
Tuesday        Messia             Walking                    10 minutes
               Matthew            Run                        20 minutes
               Pete               Run                        10 minutes
               Carol              Walking                    30 minutes
4

3 回答 3

4

我只是快速地把它放在一起,但是像这样的东西呢:

static final String[] DAYS =
{ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };

public class ActivityEvent
{
  public int day;
  public String name;
  public String typeOfExercise;
  public String time;
}

public List loadActivities(String filename) throws IOException
{
  List activities = new ArrayList();
  FileInputStream fis = new FileInputStream(filename);
  InputStreamReader isr = new InputStreamReader(fis);
  BufferedReader br = new BufferedReader(isr);
  int lastDay = -1;
  String line;
  while ((line = br.readLine()) != null)
  {
      line = line.trim();
      int day;
      for (day = DAYS.length - 1; day >= 0; day--)
      {
          if (line.equals(DAYS[day]))
          {
              break;
          }
      }
      String name;
      if (day < 0)
      {
          day = lastDay;
          if (lastDay < 0)
          {
              throw new IOException(filename + " must start with day of week");
          }
          name = line;
      }
      else
      {
          name = br.readLine();
          if (name == null)
          {
              throw new IOException(filename + " expected name, reached end of file");
          }
      }
      String type = br.readLine();
      if (type == null)
      {
          throw new IOException(filename + " expected type of exercise, reached end of file");
      }
      String time = br.readLine();
      if (time != null)
      {
          throw new IOException(filename + " expected time of exercise, reached end of file");
      }
      ActivityEvent activity = new ActivityEvent();
      activity.day = day;
      activity.name = name;
      activity.typeOfExercise = type;
      activity.time = time;
      activities.add(activity);
  }
  return activities;
}

public void printActivities(List activities)
{
    StringBuilder str = new StringBuilder("Day\tName\tType of Exercise\tTime\n");
    int numActivities = activities.size();
    int lastDay = -1;
    for (int index = 0; index < numActivities; index++)
    {
        ActivityEvent activity = (ActivityEvent)activities.get(index);
        if (activity.day != lastDay)
        {
            str.append(DAYS[activity.day]);
        }
        str.append('\t');
        str.append(activity.name);
        str.append('\t');
        str.append(activity.typeOfExercise);
        str.append('\t');
        str.append(activity.time);
        str.append('\n');
    }
    System.out.print(str.toString());
}

然后调用所有内容,例如:

List activities = loadActivities("somefile.txt");
// Do optional sorting, etc. here.
printActivities(activities);
于 2009-04-08T21:48:31.917 回答
0

我会看看 Java 的 sprintf () 函数,它能够左/右对齐具有指定宽度的数据。

于 2009-04-08T21:33:10.050 回答
0

关于解析输入:

您将遇到的一个问题是数据的每个“记录”(输出中的每一行)都不是固定大小。有些是 name,exercise,time 的 3 元组,有些是 day,name,exercise,time 的 4 元组

也就是说,假设您提供的格式确实是它的全部内容,则可以解决此问题。

读完一行后,您可以检查工作日,如果是,则假设这是 4 元组的开始,然后阅读接下来的 3 行。如果不是工作日,则假设它是一个 3 元组,并且只读取接下来的 2 行。

如果输出中的名称、类型或时间列中也可能存在“间隙”,并且以不同的组合形式存在,那么它会变得更加棘手。

您确实需要您的程序特别了解哪些值在哪些列中有效。例如,“Jessica”不是有效的锻炼类型,“Jogging”不是有效的名称。

关于格式化输出

布赖恩的回答是相关的。

这取决于您使用的语言。大多数语言都有 printf 等效项。printf 的格式化代码允许您用空格等填充。

如果您使用 Perl(可能非常适合此任务),您可以使用格式

于 2009-04-08T21:36:19.730 回答