Разделить строку на несколько пробелов, а не на одно пространство?

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

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

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

In the first line I need to read the text Pipe,Smls, be etc as single string and in the 5th and 6th line there appear blank spaces where as the previous line have data in that position, I need to insert null data for that position in the database.

# string split re
Источник
  • 4
    Разве эти столбцы не разделены символами табуляции, \t ? В противном случае невозможно отличить пробелы, разделяющие столбцы, от пробелов внутри столбцов, поэтому это было бы невыполнимой задачей. Если вы не знаете, с каким индексом символа столбец начинается и заканчивается, в этом случае просто используйте substring .
  • 2
    Вам необходимо убедиться, что вкладки преобразованы в пустое пространство. Затем прочтите полностью заполненную строку и вычислите расположение каждого столбца данных. Затем используйте эту информацию для чтения в каждой последующей строке и получения подстрок на основе номера столбца. Или просто заполните массив данных столбца на глаз.
  • 1
    Похоже, поля разделены на столбцы с пробелами. Вместо использования разделения строк используйте подстроку String для получения каждого сегмента строки.
  • 0
    @Thomas Спасибо за ваш комментарий. Я пробовал "\ т?" Это помогает мне решить одну проблему. Теперь он разделен на несколько пробелов. Но вторая проблема все еще существует.
  • 0
    @GilbertLeBlanc длина данных в каждом столбце может варьироваться, поэтому я думаю, что подстрока не работает.
  • 0
    @WJS, можешь показать мне, как это сделать ??
Codelisting
за 1 против
Лучший ответ

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

  • Вам необходимо убедиться, что ваши вкладки преобразованы в пробелы, сохраняя при этом расположение столбцов.
  • Поскольку табуляция и пробелы перемешаны, самое простое решение - просмотреть начало столбца и вручную ввести их в массив. Если вы сделаете руководство, как показано ниже, это сделать тривиально.
  • Затем просто прочитайте строки и разделите их, используя расположение столбцов.
  • За «данными» следует номер столбца или, если они сгруппированы в одном столбце, номер и буква.
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'

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

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

Codelisting
Популярные категории
На заметку программисту