gpt4 book ai didi

java - 动态读取CSV文件

转载 作者:行者123 更新时间:2023-12-01 19:44:24 25 4
gpt4 key购买 nike

介绍

我正在一个自动化项目中工作,目的是学习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有多大,我都希望读取它

感谢您对此问题的关注。

最佳答案

CSV➙平板

发明了CSV format来表示单个简单的数据平面表。 Tab-delimited文件的同上。

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

整理数据

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

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 |费用= 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个字段(信息分隔符ONE)
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对象。因此,您无需自己编写代码来处理每个数据字段。

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

杂凑

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

关于java - 动态读取CSV文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54027839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com