Ошибка ArrayIndexOutOfBoundsException при синтаксическом анализе текстового файла с разделителями табуляции в Java

#java #arrays #string #split

#java #массивы #строка #разделение

Вопрос:

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

Это отлично работает, но теперь у меня в текстовом файле есть 2 столбца данных, разделенных табуляциями. И я хочу использовать оба столбца данных в своем WHERE предложении, но я получаю

ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1 .

Я предполагаю, что он не разделяет мои данные с вкладками, и ни за что на свете не могу понять, что я делаю неправильно.

Вот мой код:

 public class Find_ImagePaths {

    public static void main(String[] args) throws IOException, SQLException {
        Connection conn = DriverManager.getConnection(
            "jdbc:mysql://myServer/myTable?useSSL=false", "UserName", "Password");
            
            Statement stmt1 = conn.createStatement(); {
                        
            BufferedReader reader = new BufferedReader(new FileReader("c:\ImageExport\SeriesDates.txt"));
            @SuppressWarnings("unused")
            int Counter = 1;
            String line;
            String pid;
            String series;
            while ((line = reader.readLine()) != null) {
                
            @SuppressWarnings({ "resource", "unused" })
            Scanner scanner = new Scanner(line);
               
                String [] token = line.split("t");
                pid = token[0];
                series = token[1];{
            
            ResultSet rs1 = stmt1.executeQuery("SELECT c.ClientID AS CID, sopi.PATHINSTORAGE, date_format(se.SeriesDate, '%Y-%m-%d') AS SeriesDate, sopi.VISITSUBGROUPVALUE as Type FROM client c LEFT JOIN Study st ON c.ID = st.CLIENT_ID LEFT JOIN Series se ON st.ID = se.STUDY_ID LEFT JOIN SOPINSTANCE sopi ON se.ID = sopi.SERIES_ID WHERE c.ClientID = '" pid "' AND date_format(se.SeriesDate, '%Y-%m-%d') = '" series "'");

            while (rs1.next() ) {
                BufferedWriter bw = null;
                bw = new BufferedWriter(new FileWriter("c:\ImageExport\PathInStorage.txt", true));

                String[] array = new String [4];

                array[0] = rs1.getString("PATHINSTORAGE");
                array[1] = rs1.getString("CID");
                if (rs1.wasNull()) 
                    array[1] = "";
                array[2] = rs1.getString("SeriesDate");
                if (rs1.wasNull()) 
                    array[2] = "";
                array[3] = rs1.getString("Type");
                if (rs1.wasNull()) 
                    array[3] = "";

                bw.write(array[0]);
                bw.write("t");
                bw.write(array[1]);
                bw.write("t");
                bw.write(array[2]);
                bw.write("t");
                bw.write(array[3]);
                    bw.newLine();
                    bw.close();     
            }
        }
    }
    reader.close();
    conn.close();                   
}}}
 

Я использую pid and series в WHERE предложении моего sql-оператора. И я предполагаю, что моя ошибка где-то здесь, поскольку это действительно единственный раздел кода, с которым я возился после добавления второго столбца данных в мой текстовый файл:

  String [] token = line.split("t");
 pid = token[0];
 series = token[1];
 

Комментарии:

1. Если он разделен табуляцией, то почему вы используете line.split(«@»); вместо line.split(» t») ?

2. Потому что я понятия не имею, что я делаю. Самоучка-сценарист. 🙁

3. Также я попробовал » t», и это не сработало. :-/

4. Тогда извините, я должен добавить, что, когда вы хотите разделить на t , поскольку аргумент split является регулярным выражением, вам нужно дважды экранировать (сначала экранировать, экранирует , чтобы конечная строка была табуляцией в регулярном выражении), т.е.: split(«\t»)

Ответ №1:

Вы можете использовать split(String regex, int limit) метод для разделения на один или несколько пробелов, используя приведенное ниже регулярное выражение:

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

Квантификатор означает одно или несколько совпадений.