Разделить строку на несколько пробелов, а не на одно пространство? - PullRequest
1 голос
/ 05 августа 2020

Я читаю текст из текстового файла и сохраняю его в базе данных. Данные отсортированы как воображаемая таблица со столбцами. Мне нужно разделить каждую строку несколькими пробелами, я пробовал этот код

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

Он разбивает строку с каждым пробелом. И еще одна проблема, которую нужно решить: я вставлю строки текста в текстовый файл.

P11570      24311VG10281-01     1           011441-X        SPL-01      1.1     7430030711      FAB     2       0.4 M       PIPE            5       938     2448        1465        2448        PIPE, SMLS, BE, 80, ASTM A106 GR.B,SOUR SERVICE     LC1-N       2"-VG-10281-011441-X-N

P11570      24311VG10281-01     1           011441-X        SPL-01      1.1     7430030711      FAB     2       0.4 M       PIPE            2       938     2448        1465        2448        PIPE, SMLS, BE, 80, ASTM A106 GR.B,SOUR SERVICE     LC1-N       2"-VG-10281-011441-X-N

P11570      24311VG10281-01     1           011441-X                    1.1     8543603141      EREC    5/8     2           BOLTS                                                               PIPE, SMLS, BE, 80, ASTM A106 GR.B,SOUR SERVICE     LC1-N       2"-VG-10281-011441-X-N

Для большей ясности я также добавлю снимок экрана. введите описание изображения здесь

В первой строке мне нужно прочитать текст Pipe, Smls, be et c как одну строку, а в 5-й и 6-й строке появляется пустое поле пробелы, где, поскольку в предыдущей строке есть данные в этой позиции, мне нужно вставить нулевые данные для этой позиции в базе данных.

1 Ответ

1 голос
/ 06 августа 2020

Вот пример того, о чем я говорил.

  • Вам нужно убедиться, что ваши вкладки преобразованы в пробелы, сохраняя при этом расположение столбцов.
  • Потому что табуляции и пробелы смешиваются, самое простое решение - просмотреть начало столбца и вручную ввести их в массив. Если вы сделаете руководство, как показано ниже, это сделать тривиально.
  • Затем просто прочитайте строки и разделите их, используя расположение столбцов.
  • За «данными» следует номер столбца , или, если они сгруппированы в одном столбце, число и букву.
String[] data = {
    //             1111111111222222222233333333334444444444555555555566666666667777777777 
    //   01234567890123456789012345678901234567890123456789012345678901234567890123456789
        "Data1  Data2      Data3   Data4   Data5a  Data5b  Data5c  Data6 Data7     Data8", 
        "Data1  Data2      Data3   Data4   Data5a  Data5b  Data5c  Data6 Data7          ", 
        "Data1  Data2      Data3                                   Data6 Data7     Data8", 
        "Data1  Data2              Data4   Data5a  Data5b  Data5c  Data6 Data7     Data8",
};

// last entry is string length of the line
int[] columnStarts = { 0, 7, 18, 26, 34, 58, 64, 74, 79};
for (String line : data) {
    int columnNumber = 0;
    for (int i = 0; i < columnStarts.length - 1; i++) {
        System.out.printf("%3d : %3d  -- '%s'%n",
                (columnNumber + 1),
                columnStarts[columnNumber],
                line.substring(columnStarts[i],
                        columnStarts[i + 1]).trim());
        columnNumber++;
    }
    System.out.println();
}

Печать

  1 :   0  -- 'Data1'
  2 :   7  -- 'Data2'
  3 :  18  -- 'Data3'
  4 :  26  -- 'Data4'
  5 :  34  -- 'Data5a  Data5b  Data5c'
  6 :  58  -- 'Data6'
  7 :  64  -- 'Data7'
  8 :  74  -- 'Data8'

  1 :   0  -- 'Data1'
  2 :   7  -- 'Data2'
  3 :  18  -- 'Data3'
  4 :  26  -- 'Data4'
  5 :  34  -- 'Data5a  Data5b  Data5c'
  6 :  58  -- 'Data6'
  7 :  64  -- 'Data7'
  8 :  74  -- ''

  1 :   0  -- 'Data1'
  2 :   7  -- 'Data2'
  3 :  18  -- 'Data3'
  4 :  26  -- ''
  5 :  34  -- ''
  6 :  58  -- 'Data6'
  7 :  64  -- 'Data7'
  8 :  74  -- 'Data8'

  1 :   0  -- 'Data1'
  2 :   7  -- 'Data2'
  3 :  18  -- ''
  4 :  26  -- 'Data4'
  5 :  34  -- 'Data5a  Data5b  Data5c'
  6 :  58  -- 'Data6'
  7 :  64  -- 'Data7'
  8 :  74  -- 'Data8'

Обратите внимание, что данные обрезаются и печатаются, чтобы показать только данные часть колонны. Без обрезки пробелов в данных будут отображаться конечные пробелы для каждого столбца.

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

...