Как отобразить данные из текстового файла в определенном формате - PullRequest
0 голосов
/ 09 апреля 2009

У меня есть текстовый файл ввода, который содержит данные, как показано ниже. Как я могу отобразить данные из текстового файла в определенный формат?

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

Ответы [ 3 ]

4 голосов
/ 09 апреля 2009

Я просто быстро скомбинировал это, но что-то вроде

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);
0 голосов
/ 09 апреля 2009

Относительно анализа ввода:

Одна из проблем, с которой вы столкнетесь, заключается в том, что каждая «запись» данных (каждая строка в выходном файле) не является фиксированным размером. Некоторые из них состоят из трех наборов имени, упражнения, времени, а другие - из четырех наборов дня, имени, упражнения и времени

Тем не менее, предполагая, что формат, который вы указали, действительно все, что нужно, проблема может быть решена.

После прочтения строки вы можете проверить рабочий день и, если это так, предположить, что это начало 4-кортежа, и прочитать следующие 3 строки. Если это не будний день, то предположим, что это 3-кортеж, и прочитайте только следующие 2 строки.

Если в выходных данных также могут быть «пробелы» в столбцах имени, типа или времени, а также в различных комбинациях, это становится сложнее.

Вам действительно нужно, чтобы ваша программа имела специальные знания о том, какие значения допустимы в каких столбцах. Например, «Джессика» не является допустимым типом упражнения, а «Бег» не является допустимым именем.

Относительно форматирования вывода

Ответ Брайана имеет значение.

Это зависит от языка, который вы используете. Большинство языков имеют printf-эквивалент. Коды форматирования printf позволяют заполнять пробелами и т. Д.

Если вы используете Perl (может хорошо подходить для этой задачи), вы можете использовать форматы

0 голосов
/ 09 апреля 2009

Я бы взглянул на функцию Java sprintf () и ее способность выравнивать влево / вправо данные с указанной шириной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...