【问题标题】:how to load a csv file into java that contains multiple whitespaces如何将csv文件加载到包含多个空格的java中
【发布时间】:2018-04-11 20:05:33
【问题描述】:

想知道如何将 csv 文件加载到 java 中并打印出结果。到目前为止,我无法让它打印出整个 csv 表。该工作表包含空格,并且带有标题:

Sales num, Account num, Date, Delivery, Codes
Sales 1,    2345   ,     May17,  Oct318, 3345                                                                        
                                         4435
                                         2234
Sales 2,   3345,         May 18, Oct318, 4456

每次销售有多个代码,但所有其他信息(帐号、数据、交货)只有一个。在代码之后第二次销售被放入,所以销售1和销售2之间有很多空白。

我找到了这段代码,但它只打印前两个单词。

 public static void main(String[] args) throws IOException{


  try {
   ArrayList < String > ar = new ArrayList < String > ();
   File csvFile = new File("C:\\Users\\AZ0000\\Documents\\Book1.csv\\");
   BufferedReader br = new BufferedReader(new FileReader(csvFile));
   String line = "";
   StringTokenizer st = null;
   int lineNumber = 0;
   int tokenNumber = 0;

   while ((line = br.readLine()) != null) {

    String[] arr = line.split(",");

    for (int i = 0; i < arr.length; i++) {
     //System.out.println(arr[0]+" " + arr[1] + arr); // h

    }

    lineNumber++;
    //use comma as token separator 

   }
  } catch (IOException ex) {

   ex.printStackTrace();

  }

我最终需要从 csv 中取出数据并将其导入文本文件中的某些行。

【问题讨论】:

  • 它只打印前两个词,因为你只打印前两个词:arr[0]+" " + arr[1]。空格不是问题。
  • 那么我如何打印出整个东西
  • System.out.print(arr[i]+" ") 在里面,System.out.println() 直接在 for 循环之后。
  • 代码后面有很多空白。有什么办法可以占用所有空间并将其排列在正确的标题下?
  • 我用line.split("");这有助于解决空白问题。但是有没有办法将它们更好地排列在标题下

标签: java csv text-files


【解决方案1】:

不确定为什么空格会成为问题,但请查看jSefa

它允许您将对象序列化为 CSV。

@CsvDataType()
public class Person {

   @CsvField(pos = 1)
   String name;

   @CsvField(pos = 2, format = "dd.MM.yyyy")
   Date birthDate;
}

【讨论】:

    【解决方案2】:

    您应该只使用正确的解析器,因为它更可靠。

    univocity-parsers 默认会删除任何不需要的空格,比使用 line.split(","); 快得多,并且会处理字段中的引号、行尾和分隔符等内容。

    试试这个代码:

    CsvParserSettings settings = new CsvParserSettings();
    settings.detectFormatAutomatically();
    
    CsvParser parser = new CsvParser(settings);
    List<String[]> allRows = parser.parseAll(new File("C:\\Users\\AZ0000\\Documents\\Book1.csv"));
    

    希望对你有帮助。

    免责声明:我是这个库的作者。它是开源和免费的(Apache 2.0 许可证)

    【讨论】:

      【解决方案3】:

      如果格式看起来像您粘贴的那样,那么它根本不是 csv ... 正确的格式应该是

      Sales num, Account num, Date, Delivery, Codes
      Sales 1,    2345   ,     May17,  Oct318, 3345                                                                        
      Sales 1,    2345   ,     May17,  Oct318, 4435
      Sales 1,    2345   ,     May17,  Oct318, 2234
      Sales 2,   3345,         May 18, Oct318, 4456
      

      或者使用另一个分隔符来拆分一列中的多个值,例如。

      Sales num, Account num, Date, Delivery, Codes
      Sales 1,    2345   ,     May17,  Oct318, 3345;4435;2234
      Sales 2,   3345,         May 18, Oct318, 4456
      

      在我看来,最好的方法是拥有像

      这样的文件
      Sales num,Account num,Date,Delivery,Codes
      Sales 1,2345,May 17,Oct318,3345;4435;2234
      Sales 2,3345,May 18,Oct318,4456
      

      然后简单地读取行,用逗号分隔,,最后一列用;分隔

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-19
        • 1970-01-01
        • 2015-02-08
        • 2020-06-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多