动态读取CSV文件

时间:2019-01-03 18:27:23

标签: java loops csv

简介

我正在一个自动化项目中工作,目的是学习Java和数据科学的新技巧(非常简单的水平),一切都是自学的。

问题

这是我如何存储此数据的示例.csv文件。

Date when obtained
Format for identifying the numbers below
data
.
.
.
.
data

我当前正在使用CSV。

2018/12/29
name,quantity,quality,realmQ,cost
Tejido,321 908,13.55,43.18,$15.98,
Ropa,195 045,20.55,45.93,$123.01,
Gorra de visera,126 561,17.43,42.32,$79.54,
Cerveza,80 109,3.37,17.93,$12.38,
Mercancías de playa,75 065,11.48,39.73,$105.93,
Bebidas alcohólicas,31 215,4.84,27.90,$32.29,
Artículos de cuero,19 098,23.13,44.09,$198.74,
Bolsas y carteras,7 754,23.09,41.34,$1 176.54,
2018/12/30
name,quantity,quality,realmQ,cost
Tejido,252 229,12.86,43.14,$18.87,
Ropa,132 392,18.09,46.02,$177.58,
Gorra de visera,87 676,14.42,42.46,$122.48,
Cerveza,44 593,2.72,17.79,$18.71,
Mercancías de playa,44 593,8.26,39.56,$200.78,
Bebidas alcohólicas,27 306,4.30,23.88,$31.95,
Artículos de cuero,16 147,21.08,43.91,$207.49,
Bolsas y carteras,6 552,21.11,40.59,$1 195.41,
2019/01/02
name,quantity,quality,realmQ,cost
Tejido,321 908,13.55,43.18,$15.98,
Ropa,195 045,20.55,45.93,$123.01,
Gorra de visera,126 561,17.43,42.32,$79.54,
Cerveza,80 109,3.37,17.93,$12.38,
Mercancías de playa,75 065,11.48,39.73,$105.93,
Bebidas alcohólicas,31 215,4.84,27.90,$32.29,
Artículos de cuero,19 098,23.13,44.09,$198.74,
Bolsas y carteras,7 754,23.09,41.34,$1 176.54,
2019/01/03
name,quantity,quality,realmQ,cost
Tejido,321 908,13.55,43.18,$15.98,
Ropa,195 045,20.55,45.93,$123.01,
Gorra de visera,126 561,17.43,42.32,$79.54,
Cerveza,80 109,3.37,17.93,$12.38,
Mercancías de playa,75 065,11.48,39.73,$105.93,
Bebidas alcohólicas,31 215,4.84,27.90,$32.29,
Artículos de cuero,19 098,23.13,44.09,$198.74,
Bolsas y carteras,7 754,23.09,41.34,$1 176.54,

我想让它变得动态并且更大。我决定使用一个大的.csv文件来存储所有内容,而不是按日期分类的多个.csv文件,这就是结果。

到目前为止,我使用的代码只能读取一个.csv,但是如果我在下面添加更多数据。没用我知道这与调试器中看到的循环有关,但是仍然找不到正确的解决方案。

代码

public class CSVinput {

    static String[] nombre = new String[8];
    static int[] cantidad = new int[8];
    static double[] calidad = new double[8];
    static double[] realmQ = new double[8];
    static double[] coste = new double[8];    

public static void ImportData(String path) throws FileNotFoundException
{
    /*Can only load one csv with 8 stuff in it*/
    System.out.println("Presenting data...");


        try (Scanner scan = new Scanner(new File(path))) {
            scan.useDelimiter(",");
            String date = scan.nextLine();
            System.out.println("fecha: " + date);
            scan.nextLine();

            int index = 0;
            while(scan.hasNext() == true)
                try{
                {                    
                    String name = scan.next().replaceAll("\n", "");
                        nombre[index] = name;
                    System.out.println("nombre: " + name);
                    int quantity = Integer.parseInt(scan.next().replaceAll(" ", ""));
                        cantidad[index] = quantity;
                    System.out.println("cantidad: " + quantity);
                    double quality = Double.parseDouble(scan.next());
                        calidad[index] = quality;
                    System.out.println("calidad: " + quality);
                    double realmq = Double.parseDouble(scan.next());
                        realmQ[index] = realmq;
                    System.out.println("realmQ: " + realmq);
                    double cost = Double.parseDouble(scan.next().replace("$", "").replace(" ", ""));
                        coste[index] = cost;
                    System.out.println("coste: $" + cost);

                    index++;                    
                }
                } catch(ArrayIndexOutOfBoundsException e){}    
        }     
}

   public static void main(String[] args) throws FileNotFoundException
         {
             ImportData("caca.csv");             
         }
}

注释

发布的这段代码是与单个.csv一起使用的代码,这意味着您需要输入该代码,并且代码也应该“拆分”数据,以便于使用。

2018/12/29
name,quantity,quality,realmQ,cost
Tejido,321 908,13.55,43.18,$15.98,
Ropa,195 045,20.55,45.93,$123.01,
Gorra de visera,126 561,17.43,42.32,$79.54,
Cerveza,80 109,3.37,17.93,$12.38,
Mercancías de playa,75 065,11.48,39.73,$105.93,
Bebidas alcohólicas,31 215,4.84,27.90,$32.29,
Artículos de cuero,19 098,23.13,44.09,$198.74,
Bolsas y carteras,7 754,23.09,41.34,$1 176.54,

我期望的结果

如果我在前一个(附录)之后添加更多.csv数据,则无论.csv有多大,我都希望它读取它

感谢您对此问题的关注。

3 个答案:

答案 0 :(得分:2)

CSV➙平板电脑

发明CSV format代表一个简单的数据平面表。与Tab-delimited文件相同。

您具有日期层次结构,该层次结构映射到名称-数量-质量-领域Q-成本元组的集合。那是不是简单的平面表格数据。

整理数据

如果要将其存储为CSV,则必须通过添加日期列并在tuples的集合中重复日期值来展平,以使其成为 date -name-数量质量领域Q成本元组。

date,name,quantity,quality,realmQ,cost
2018-12-29,Tejido,321 908,13.55,43.18,$15.98
2018-12-29,Ropa,195 045,20.55,45.93,$123.01
2018-12-29,Gorra de visera,126 561,17.43,42.32,$79.54
2018-12-29,Cerveza,80 109,3.37,17.93,$12.38
2018-12-29,Mercancías de playa,75 065,11.48,39.73,$105.93
2018-12-29,Bebidas alcohólicas,31 215,4.84,27.90,$32.29
2018-12-29,Artículos de cuero,19 098,23.13,44.09,$198.74
2018-12-29,Bolsas y carteras,7 754,23.09,41.34,$1 176.54

现在可以读取该数据并将其写入CSV文件。

请注意您的分隔符。请注意,每行的最后一个字段后不应有逗号。

Apache Commons CSV

Apache Commons CSV库将为您执行CSV解析,读取和写入。几次对我来说效果很好。

已清理数据

让我们使用此内容以及示例数据的拼合版本来解析data.csv文件。数据已清理:

  • 将日期切换为标准ISO 8601格式
  • 以整数消除了空格字符
  • 已删除$个字符
  • 删除每行末尾的多余逗号
  • 将产品名称翻译成英文(对于此英文版的Stack Overflow)。
date,name,quantity,quality,realmQ,cost
2018-12-29,Fabric,321908,13.55,43.18,15.98
2018-12-29,Clothing,195045,20.55,45.93,123.01
2018-12-29,Visor Cap,126561,17.43,42.32,79.54
2018-12-29,Beer,80109,3.37,17.93,12.38
2018-12-29,Beach goods,75065,11.48,39.73,105.93
2018-12-29,Alcoholic beverages,31215,4.84,27.90,32.29
2018-12-29,Leather goods,19098,23.13,44.09,198.74
2018-12-29,Bags and wallets,7754,23.09,41.34,1176.54
2018-12-30,Fabric,252229,12.86,43.14,18.87
2018-12-30,Clothing,132392,18.09,46.02,177.58
2018-12-30,Visor Cap,87676,14.42,42.46,122.48
2018-12-30,Beer,44593,2.72,17.79,18.71
2018-12-30,Beach goods,44593,8.26,39.56,200.78
2018-12-30,Alcoholic beverages,27306,4.30,23.88,31.95
2018-12-30,Leather goods,16147,21.08,43.91,207.49
2018-12-30,Bags and wallets,6552,21.11,40.59,1195.41
2019-01-02,Fabric,321908,13.55,43.18,15.98
2019-01-02,Clothing,195045,20.55,45.93,123.01
2019-01-02,Visor Cap,126561,17.43,42.32,79.54
2019-01-02,Beer,80109,3.37,17.93,12.38
2019-01-02,Beach goods,75065,11.48,39.73,105.93
2019-01-02,Alcoholic beverages,31215,4.84,27.90,32.29
2019-01-02,Leather goods,19098,23.13,44.09,198.74
2019-01-02,Bags and wallets,7754,23.09,41.34,1176.54
2019-01-03,Fabric,321908,13.55,43.18,15.98
2019-01-03,Clothing,195045,20.55,45.93,123.01
2019-01-03,Visor Cap,126561,17.43,42.32,79.54
2019-01-03,Beer,80109,3.37,17.93,12.38
2019-01-03,Beach goods,75065,11.48,39.73,105.93
2019-01-03,Alcoholic beverages,31215,4.84,27.90,32.29
2019-01-03,Leather goods,19098,23.13,44.09,198.74
2019-01-03,Bags and wallets,7754,23.09,41.34,1176.54

我们定义一个类来容纳每个元组。

package com.basilbourque.example;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Objects;

public class DailyProduct {
    // date,name,quantity,quality,realmQ,cost
    // 2018-12-29,Fabric,321908,13.55,43.18,15.98
    // 2018-12-29,Clothing,195045,20.55,45.93,123.01
    // 2018-12-29,Visor Cap,126561,17.43,42.32,79.54
    // 2018-12-29,Beer,80109,3.37,17.93,12.38
    // 2018-12-29,Beach goods,75065,11.48,39.73,105.93
    // 2018-12-29,Alcoholic beverages,31215,4.84,27.90,32.29
    // 2018-12-29,Leather goods,19098,23.13,44.09,198.74
    // 2018-12-29,Bags and wallets,7754,23.09,41.34,1176.54

    public enum Header {
        DATE, NAME, QUANTITY, QUALITY, REALMQ, COST;
    }

    // ----------|  Member vars  |-----------------------------------
    public LocalDate localDate;
    public String name;
    public Integer quantity;
    public BigDecimal quality, realmQ, cost;

    // ----------|  Constructor  |-----------------------------------
    public DailyProduct ( LocalDate localDate , String name , Integer quantity , BigDecimal quality , BigDecimal realmq , BigDecimal cost ) {
        this.localDate = Objects.requireNonNull( localDate );
        this.name = Objects.requireNonNull( name );
        this.quantity = Objects.requireNonNull( quantity );
        this.quality = Objects.requireNonNull( quality );
        this.realmQ = Objects.requireNonNull( realmq );
        this.cost = Objects.requireNonNull( cost );
    }

    // ----------|  `Object` overrides  |-----------------------------------
    @Override
    public String toString ( ) {
        return "com.basilbourque.example.DailyProduct{ " +
                "localDate=" + localDate +
                " | name='" + name + '\'' +
                " | quantity=" + quantity +
                " | quality=" + quality +
                " | realmq=" + realmQ +
                " | cost=" + cost +
                " }";
    }

    @Override
    public boolean equals ( Object o ) {
        if ( this == o ) return true;
        if ( o == null || getClass() != o.getClass() ) return false;
        DailyProduct that = ( DailyProduct ) o;
        return localDate.equals( that.localDate ) &&
                name.equals( that.name );
    }

    @Override
    public int hashCode ( ) {
        return Objects.hash( localDate , name );
    }

}

写一个类来读写包含DailyProduct对象数据的文件。

package com.basilbourque.example;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.CSVRecord;

import java.io.BufferedReader;
import java.io.IOException;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Instant;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;

public class DailyProductFileHandler {
    public List < DailyProduct > read ( Path path ) {
        // TODO: Add a check for valid file existing.

        List < DailyProduct > list = List.of();  // Default to empty list.
        try {
            // Prepare list.
            int initialCapacity = ( int ) Files.lines( path ).count();
            list = new ArrayList <>( initialCapacity );

            // Read CSV file. For each row, instantiate and collect `DailyProduct`.
            BufferedReader reader = Files.newBufferedReader( path );
            Iterable < CSVRecord > records = CSVFormat.RFC4180.withFirstRecordAsHeader().parse( reader );
            for ( CSVRecord record : records ) {
                // date,name,quantity,quality,realmQ,cost
                LocalDate localDate = LocalDate.parse( record.get( "date" ) );
                String name = record.get( "name" );
                Integer quantity = Integer.valueOf( record.get( "quantity" ) );
                BigDecimal quality = new BigDecimal( record.get( "quality" ) );
                BigDecimal realmQ = new BigDecimal( record.get( "realmQ" ) );  // Note: case-sensitive.
                BigDecimal cost = new BigDecimal( record.get( "cost" ) );
                // Instantiate `DailyProduct` object, and collect it.
                DailyProduct dailyProduct = new DailyProduct( localDate , name , quantity , quality , realmQ , cost );
                list.add( dailyProduct );
            }
        } catch ( IOException e ) {
            e.printStackTrace();
        }
        return list;
    }

    public void write ( final List < DailyProduct > dailyProducts , final Path path ) {
        try ( final CSVPrinter printer = CSVFormat.RFC4180.withHeader( "date" , "name" , "quantity" , "quality" , "realmQ" , "cost" ).print( path , StandardCharsets.UTF_8 ) ; ) {
            for ( DailyProduct dp : dailyProducts ) {
                printer.printRecord( dp.localDate , dp.name , dp.quantity , dp.quality , dp.realmQ , dp.cost );
            }
        } catch ( IOException e ) {
            e.printStackTrace();
        }
    }

    public static void main ( final String[] args ) {
        DailyProductFileHandler fileHandler = new DailyProductFileHandler();

        Path pathInput = Paths.get( "/Users/basilbourque/data.csv" );
        List < DailyProduct > list = fileHandler.read( pathInput );
        System.out.println( list );

        String when = Instant.now().truncatedTo( ChronoUnit.SECONDS ).toString().replace( ":" , "•" );
        Path pathOutput = Paths.get( "/Users/basilbourque/data_" + when + ".csv" );
        fileHandler.write( list , pathOutput );
        System.out.println( "Writing file: " + pathOutput );
    }
}

运行时:

  

[com.basilbourque.example.DailyProduct {localDate = 2018-12-29 | name ='Fabric'|数量= 321908 |质量= 13.55 | realmq = 43.18 | cost = 15.98},com.basilbourque.example.DailyProduct {localDate = 2018-12-29 | name =“服装” |数量= 195045 |质量= 20.55 | realmq = 45.93 | cost = 123.01},com.basilbourque.example.DailyProduct {localDate = 2018-12-29 | name =“遮阳帽” |数量= 126561 |质量= 17.43 | realmq = 42.32 | cost = 79.54},com.basilbourque.example.DailyProduct {localDate = 2018-12-29 | name ='啤酒'|数量= 80109 |质量= 3.37 | realmq = 17.93 | cost = 12.38},com.basilbourque.example.DailyProduct {localDate = 2018-12-29 |名称=“海滩商品” |数量= 75065 |质量= 11.48 | realmq = 39.73 | cost = 105.93},com.basilbourque.example.DailyProduct {localDate = 2018-12-29 |名称=“酒精饮料” |数量= 31215 |质量= 4.84 | realmq = 27.90 | cost = 32.29},com.basilbourque.example.DailyProduct {localDate = 2018-12-29 |名称=“皮革商品” |数量= 19098 |质量= 23.13 | realmq = 44.09 | cost = 198.74},com.basilbourque.example.DailyProduct {localDate = 2018-12-29 | name =“手袋和钱包” |数量= 7754 |质量= 23.09 | realmq = 41.34 | cost = 1176.54},com.basilbourque.example.DailyProduct {localDate = 2018-12-30 | name ='Fabric'|数量= 252229 |质量= 12.86 | realmq = 43.14 | cost = 18.87},com.basilbourque.example.DailyProduct {localDate = 2018-12-30 | name =“服装” |数量= 132392 |质量= 18.09 | realmq = 46.02 | cost = 177.58},com.basilbourque.example.DailyProduct {localDate = 2018-12-30 | name =“遮阳帽” |数量= 87676 |质量= 14.42 | realmq = 42.46 | cost = 122.48},com.basilbourque.example.DailyProduct {localDate = 2018-12-30 | name ='啤酒'|数量= 44593 |质量= 2.72 | realmq = 17.79 | cost = 18.71},com.basilbourque.example.DailyProduct {localDate = 2018-12-30 |名称=“海滩商品” |数量= 44593 |质量= 8.26 | realmq = 39.56 | cost = 200.78},com.basilbourque.example.DailyProduct {localDate = 2018-12-30 |名称=“酒精饮料” |数量= 27306 |质量= 4.30 | realmq = 23.88 | cost = 31.95},com.basilbourque.example.DailyProduct {localDate = 2018-12-30 |名称=“皮革商品” |数量= 16147 |质量= 21.08 | realmq = 43.91 | cost = 207.49},com.basilbourque.example.DailyProduct {localDate = 2018-12-30 | name =“手袋和钱包” |数量= 6552 |质量= 21.11 | realmq = 40.59 | cost = 1195.41},com.basilbourque.example.DailyProduct {localDate = 2019-01-02 | name ='Fabric'|数量= 321908 |质量= 13.55 | realmq = 43.18 | cost = 15.98},com.basilbourque.example.DailyProduct {localDate = 2019-01-02 | name =“服装” |数量= 195045 |质量= 20.55 | realmq = 45.93 | cost = 123.01},com.basilbourque.example.DailyProduct {localDate = 2019-01-02 | name =“遮阳帽” |数量= 126561 |质量= 17.43 | realmq = 42.32 | cost = 79.54},com.basilbourque.example.DailyProduct {localDate = 2019-01-02 | name ='啤酒'|数量= 80109 |质量= 3.37 | realmq = 17.93 | cost = 12.38},com.basilbourque.example.DailyProduct {localDate = 2019-01-02 |名称=“海滩商品” |数量= 75065 |质量= 11.48 | realmq = 39.73 | cost = 105.93},com.basilbourque.example.DailyProduct {localDate = 2019-01-02 |名称=“酒精饮料” |数量= 31215 |质量= 4.84 | realmq = 27.90 | cost = 32.29},com.basilbourque.example.DailyProduct {localDate = 2019-01-02 |名称=“皮革商品” |数量= 19098 |质量= 23.13 | realmq = 44.09 | cost = 198.74},com.basilbourque.example.DailyProduct {localDate = 2019-01-02 | name =“手袋和钱包” |数量= 7754 |质量= 23.09 | realmq = 41.34 | cost = 1176.54},com.basilbourque.example.DailyProduct {localDate = 2019-01-03 | name ='Fabric'|数量= 321908 |质量= 13.55 | realmq = 43.18 | cost = 15.98},com.basilbourque.example.DailyProduct {localDate = 2019-01-03 | name =“服装” |数量= 195045 |质量= 20.55 | realmq = 45.93 | cost = 123.01},com.basilbourque.example.DailyProduct {localDate = 2019-01-03 | name =“遮阳帽” |数量= 126561 |质量= 17.43 | realmq = 42.32 | cost = 79.54},com.basilbourque.example.DailyProduct {localDate = 2019-01-03 | name ='啤酒'|数量= 80109 |质量= 3.37 | realmq = 17.93 | cost = 12.38},com.basilbourque.example.DailyProduct {localDate = 2019-01-03 |名称=“海滩商品” |数量= 75065 |质量= 11.48 | realmq = 39.73 | cost = 105.93},com.basilbourque.example.DailyProduct {localDate = 2019-01-03 |名称=“酒精饮料” |数量= 31215 |质量= 4.84 | realmq = 27.90 | cost = 32.29},com.basilbourque.example.DailyProduct {localDate = 2019-01-03 |名称=“皮革商品” |数量= 19098 |质量= 23.13 | realmq = 44.09 | cost = 198.74},com.basilbourque.example.DailyProduct {localDate = 2019-01-03 | name =“手袋和钱包” |数量= 7754 |质量= 23.09 | realmq = 41.34 |费用= 1176.54}]

     

编写文件:/Users/basilbourque/data_2019-01-05T03•48•37Z.csv

ISO 8601

顺便说一句,在将日期时间值序列化为文本时,请始终使用标准的ISO 8601格式。对于没有日期和时区的仅日期值,该值为YYYY-MM-DD。

XML和JSON

如果要保留层次结构,请使用CSV以外的其他文件格式。通常XMLJSON用于此类数据。

数据库

您的问题没有提供足够的细节来确定,但是我觉得您应该使用database而不是文本文件。如果您正在读取,编辑和附加新数据,以获取大量数据(足够大意味着足以影响内存限制),或者您正在使用多个进程/线程/用户,则需要一个数据库。数据库旨在有效处理太大而无法完全放入内存的数据。数据库被设计为处理concurrent access

内存中的数据

  

我必须解析csvFile中的数据,现在我正在处理少量的10种产品,但是如果我使用的是100种甚至上千种

那不是您所说的“大”字。甚至Raspberry PiBeaglebone Black都具有足够的RAM来将数千个这样的元组加载到内存中。

收藏

  

或其他任何我希望程序创建动态数组的数字,因此我不必每次想要输入数据时都手动更改数组尺寸。

您需要学习Java Collections Framework,而不是使用简单的数组。

尤其是,通常使用Map(某些人also called a dictionary)来表示日期到元组的层次结构。此数据结构是键-值对的集合,其中日期将是您的,而SetList元组将是是您的

为元组数据定义一个类,命名为Product之类。添加成员变量:namequantityqualityrealmqcost。为每个元组实例化一个对象。

创建一个Map,例如TreeMap。成为SortedMap可以使您的日期按时间顺序排列。

SortedMap< Product > map = new TreeMap<>() ;

使用LocalDate作为日期值,即地图中的

LocalDate ld = LocalDate.of( 2018 , 1 , 23 ) ;
map.put( ld , new ArrayList< Product >() ) ; // Pass an initial capacity in those parens if you know a likely size of the list.

对于每个Product对象,从地图上检索相关日期的列表,然后将产品添加到列表中。

序列化时,使用XML或JSON框架将映射写入存储。

或者自己做,编写自己的数据格式。从地图上获取所有键,循环它们,将每个日期写入文件。并针对每个日期从地图中提取其列表(每个键的每个值)。循环列表中的Product对象。写下每个产品的成员变量。使用任何字段和行delimiters。尽管由于我从未理解的原因而很少使用,但ASCII(Unicode的子集)具有specific delimiter characters。我建议您使用these separatorscode points

  • 字段31(信息分隔符一)
  • 30行(信息分隔符2)
  • 组29个(信息分隔符3)
  • 28个文件(信息分隔符四)

所有这些问题在Stack Overflow上已得到解决。搜索以了解更多信息。

外来文字

序列化数据时,请勿包含多余的文本。

您的$栏中的cost只是杂音。如果要表示一种特定的货币,那么简单的$可能无法完成工作,因为它可能是加元,美元,墨西哥比索或其他货币。因此,请使用standard currency symbol,例如CADUSDMXN。如果所有值都使用一种已知的货币(例如CAD),请完全省略“ $”。

性能

前言:如果您经常将数据移入或移出这些文件进行更新,则应该使用数据库而不是文本文件。

无需担心CSV,XML和JSON的性能。

首先,您会陷入过早优化的邪恶陷阱(google / duckduckgo这个短语)。

第二,您必须拥有大量经常处理的数据,以使任何性能上的显着差异都远远超过普通商务应用程序。从存储设备(甚至从SSD驱动器)访问任何格式的文件都非常慢,以至于与CPU驱动的数据处理时间相形见that。

根据适合数据和应用程序的需求选择格式。

对于简单的平面数据,请使用CSV或制表符分隔或ASCII / Unicode代码进行分隔(代码点28-31)。

对于分层数据,请使用XML。 XML具有可以通过规范非常精确地定义的优点。已经为XML构建了许多工具。 XML Schema也定义明确。这提供了一种强大的方法,可以在尝试处理之前验证传入的数据文件。

对于JSON,仅在必要时使用,并且仅用于少量相对简单的数据。它缺少XML的定义明确的规范和架构。它不适用于深层次结构或庞大的集合。 JSON之所以存在,是因为它对JavaScript程序员来说非常方便,并且因为IT行业对重新发明轮子的自虐倾向。

XML和JSON具有一个主要优点:绑定。在Java世界中,既有标准框架又有方便但非标准的框架,可用于将Java对象自动序列化为XML或JSON文本。朝另一个方向发展,这些框架可以直接从传入的XML / JSON实例化Java对象。因此,您无需自己编写代码来处理每个数据字段。

对于“问题”中显示的简单数据,此绑定功能不值得打扰。为此,使用 Apache Commons CSV 的CSV或制表符分隔是合适的,如本答案所示。

哈希

提示:您应该发送每个数据文件的哈希(MD5,SHA等)。接收到文件和哈希后,接收计算机将重新计算传入文件的哈希。然后比较散列结果以验证数据文件到达时数据没有损坏。

答案 1 :(得分:1)

您是否尝试过不仅捕获ArrayIndexOutOfBoundsException e,而且还捕获所有发生的异常(例如,通过附加的} catch(Excepction e))并将其打印出来?

据我所见,您的循环会在第二个区块的日期到达时立即中断。 (因为您的循环需要值而不是单个日期字段)。

附加项:

CSV应该/可能只有一个标题行,而不是几个。

我会考虑删除日期和中间的Header声明,并将日期用作数据的一部分(第6列),因为这很可能会遵循CSV文件。

例如代替这个:

2018/12/29 name,quantity,quality,realmQ,cost Tejido,321 908,13.55,43.18,$15.98, Ropa,195 045,20.55,45.93,$123.01, 2018/12/30 name,quantity,quality,realmQ,cost Tejido,324 708,13.55,43.18,$17.98, Ropa,111 045,20.55,45.93,$14.01,

您可以/应该这样做:

name,quantity,quality,realmQ,cost,date Tejido,321 908,13.55,43.18,$15.98,2018/12/29 Ropa,195 045,20.55,45.93,$123.01,2018/12/29 Tejido,324 708,13.55,43.18,$17.98,2018/12/30 Ropa,111 045,20.55,45.93,$14.01,2018/12/30

-当然-将获取的日期移到循环中。

HTH

答案 2 :(得分:0)

Make decisions on the basis of pattern matching to insert data in the array. 

Case: pattern match date, insert in your array and don’t increment the index, jump on to another line and add the field on the same index, continue like this. 

Regarding multiple header string match the pattern again and process accordingly.

Date pattern : \d{4}/\d{2}/\d{2}
Header Pattern : [\p{L},]+
Value Pattern : [\p{L}\p{N},.]+

HTH
相关问题