【问题标题】:Split a string with a space in Java, when a space occurs?当出现空格时,在Java中用空格分割字符串?
【发布时间】:2021-11-19 23:14:12
【问题描述】:

我正在尝试从 CSV 文件中提取数据,其中有以下示例 CSV

timestamp, Column1,column2,column3
2019-05-07 19:17:23,x,y,z
2019-03-30 19:41:33,a,b,c
etc.

目前,我的代码如下:

public static void main(String[]args){
        String blah = "file.csv";
        File file = new File(blah);
        try{
            Scanner iterate = new Scanner(file);
            iterate.next(); //skips the first line
            while(iterate.hasNext()){
                String data = iterate.next();
                String[] values = data.split(",");
                Float nbr = Float.parseFloat(values[2]);
                System.out.println(nbr);
            }

            iterate.close();
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }
    }

但是,我的代码给了我一个错误

java.lang.ArrayIndexOutOfBoundsException: Index 3 is out of bounds for length 3

我的理论是分裂是这里的问题。由于没有逗号,我的程序认为数组仅以第一个元素结尾,因为第一个元素上没有逗号(我已经用时间戳列对其进行了测试,它似乎可以工作,但是,我想打印这些值在第 3 列)

如何使用 split 函数获取 column1、column2 和 column3 的值?

【问题讨论】:

  • 在打印之前放置一个if (values.length > 2) 检查以防止错误如何?或者在调试器中运行您的代码以查看问题所在?
  • 另外,我认为你想要.nextLine().hasNextLine(),否则,你会读到空格或行尾字符之前
  • 你的代码没有像你提到的那样工作,你提到的运行没有得到日期,只是时间,正如早期评论中提到的那样(使用.nextLine()。也不清楚是什么是Float nbr = Float.parseFloat(values[2]);的意图请澄清
  • 我希望 column3 是一个浮点值,以便在以后的操作中使用。目前,我仍在使用 print 语句进行调试,因此 parsefloat 目前相对无关紧要。
  • 如果这不是家庭作业,请不要重新发明轮子:commons.apache.org/proper/commons-csv/index.html。无论如何,您的示例列是一个字符。可能您正在使用逗号作为小数分隔符 (?) 的浮点数。

标签: java csv java.util.scanner


【解决方案1】:
import java.util.*;    
import java.util.*;     
import java.io.*;  
public class Sample  
{  
public static void main(String[] args)   
{  
String line = "";  
String splitBy = ",";  
try   
{  int i=0;
String file="blah.csv";   
BufferedReader br = new BufferedReader(new FileReader(file));    
int iteration=0;   
while ((line = br.readLine()) != null)   //returns a Boolean value  
{  if(iteration < 1) {  
  iteration++;     
  continue;}   //skips the first line
String[] stu = line.split(splitBy);    
String time=stu[3];   
System.out.println(time);   
 }   
}    
catch (IOException e)      
{     
 e.printStackTrace();    
 }} }    

使用 BufferedReader 试试这个方法
输入:

timestamp, Column1,column2,column3    
2019-05-07 19:17:23,x,y,z    
2019-03-30 19:41:33,a,b,c    
2019-05-07 19:17:23,x,y,a    
2019-03-30 19:41:33,a,b,f    
2019-05-07 19:17:23,x,y,x    
2019-03-30 19:41:33,a,b,y    

以上代码的输出是:

z   
c   
a   
f
x
y

【讨论】:

    【解决方案2】:

    一些建议:

    1. 使用Scanner#nextLineScanner#hasNextLine
    2. 使用try-with-resources 声明。
    3. 因为行有空格或逗号作为分隔符,所以使用正则表达式模式\s+|, 作为split 方法的参数。正则表达式模式\s+|, 表示一个或多个空白字符或逗号。或者,您可以使用 [\s+,] 作为正则表达式模式。

    演示:

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.util.Arrays;
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) throws FileNotFoundException {
            String blah = "file.csv";
            File file = new File(blah);
            try (Scanner iterate = new Scanner(file)) {
                iterate.nextLine(); // skips the first line
                while (iterate.hasNextLine()) {
                    String line = iterate.nextLine();
                    String[] values = line.split("[\\s+,]");
                    System.out.println(Arrays.toString(values));
                }
            }
        }
    }
    

    输出:

    [2019-05-07, 19:17:23, x, y, z]
    [2019-03-30, 19:41:33, a, b, c]
    

    【讨论】:

      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 2020-05-16
      • 2020-06-17
      • 2014-12-13
      • 2013-08-02
      • 2023-04-02
      • 1970-01-01
      • 2013-10-11
      相关资源
      最近更新 更多