逐列读取CSV文件

我想从多列csv文件中读取特定列,并使用Java在其他csv文件中打印这些列。 有什么帮助吗? 以下是我的代码逐行打印每个标记..但我打算只打印多列csv中的几列。

import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.util.StringTokenizer; public class ParseCSV { public static void main(String[] args) { try { //csv file containing data String strFile = "C:\\Users\\rsaluja\\CMS_Evaluation\\Drupal_12_08_27.csv"; //create BufferedReader to read csv file BufferedReader br = new BufferedReader( new FileReader(strFile)); String strLine = ""; StringTokenizer st = null; int lineNumber = 0, tokenNumber = 0; //read comma separated file line by line while( (strLine = br.readLine()) != null) { lineNumber++; //break comma separated line using "," st = new StringTokenizer(strLine, ","); while(st.hasMoreTokens()) { //display csv values tokenNumber++; System.out.println("Line # " + lineNumber + ", Token # " + tokenNumber + ", Token : "+ st.nextToken()); System.out.println(cols[4]); 

您应该使用优秀的OpenCSV来读取和写入CSV文件。 要使您的示例适应使用库,它将如下所示:

 public class ParseCSV { public static void main(String[] args) { try { //csv file containing data String strFile = "C:/Users/rsaluja/CMS_Evaluation/Drupal_12_08_27.csv"; CSVReader reader = new CSVReader(new FileReader(strFile)); String [] nextLine; int lineNumber = 0; while ((nextLine = reader.readNext()) != null) { lineNumber++; System.out.println("Line # " + lineNumber); // nextLine[] is an array of values from the line System.out.println(nextLine[4] + "etc..."); } } } } 

在Java中读取非常简单和常见的CSV文件。 您实际上不需要加载任何额外的第三方库来为您执行此操作。 CSV(逗号分隔值)文件只是一个普通的纯文本文件,逐列存储数据,并用分隔符(例如逗号“,”)拆分。

为了从CSV文件中读取特定列,有几种方法。 最简单的如下:

无任何第三方库读取CSV的代码

 BufferedReader br = new BufferedReader(new FileReader(csvFile)); while ((line = br.readLine()) != null) { // use comma as separator String[] cols = line.split(cvsSplitBy); System.out.println("Coulmn 4= " + cols[4] + " , Column 5=" + cols[5]); } 

如果你注意到,这里没有什么特别的 。 它只是读取一个文本文件,然后用分隔符 – “,”进行吐出。

考虑GeoLite免费下载数据库中遗留国家/地区CSV数据的摘录

 "1.0.0.0","1.0.0.255","16777216","16777471","AU","Australia" "1.0.1.0","1.0.3.255","16777472","16778239","CN","China" "1.0.4.0","1.0.7.255","16778240","16779263","AU","Australia" "1.0.8.0","1.0.15.255","16779264","16781311","CN","China" "1.0.16.0","1.0.31.255","16781312","16785407","JP","Japan" "1.0.32.0","1.0.63.255","16785408","16793599","CN","China" "1.0.64.0","1.0.127.255","16793600","16809983","JP","Japan" "1.0.128.0","1.0.255.255","16809984","16842751","TH","Thailand" 

以上代码将输出如下:

 Column 4= "AU" , Column 5="Australia" Column 4= "CN" , Column 5="China" Column 4= "AU" , Column 5="Australia" Column 4= "CN" , Column 5="China" Column 4= "JP" , Column 5="Japan" Column 4= "CN" , Column 5="China" Column 4= "JP" , Column 5="Japan" Column 4= "TH" , Column 5="Thailand" 

实际上,您可以put列放在Map ,然后只需使用key即可获取值。

Shishir

对不起,这些答案都没有提供最佳解决方案。 如果使用OpenCSV之类的库,则必须编写大量代码来处理特殊情况以从特定列中提取信息。

例如,如果列的列数少于您所使用的行数,则必须编写大量代码来处理它。 使用OpenCSV示例:

  CSVReader reader = new CSVReader(new FileReader(strFile)); String [] nextLine; while ((nextLine = reader.readNext()) != null) { //let's say you are interested in getting columns 20, 30, and 40 String[] outputRow = new String[3]; if(parsedRow.length < 40){ outputRow[2] = null; } else { outputRow[2] = parsedRow[40] } if(parsedRow.length < 30){ outputRow[1] = null; } else { outputRow[1] = parsedRow[30] } if(parsedRow.length < 20){ outputRow[0] = null; } else { outputRow[0] = parsedRow[20] } } 

这是一个简单要求的代码。 如果您尝试按名称获取列的值,情况会变得更糟。 您应该使用更现代的解析器,例如uniVocity解析器提供的解析器 。

要可靠,轻松地获取所需的列,只需写:

 CsvParserSettings settings = new CsvParserSettings(); parserSettings.selectIndexes(20, 30, 40); CsvParser parser = new CsvParser(settings); List allRows = parser.parseAll(new FileReader(yourFile)); 

披露:我是这个图书馆的作者。 它是开源和免费的(Apache V2.0许可证)。

我建议使用Apache Commons CSV https://commons.apache.org/proper/commons-csv/

这是一个例子:

  Path currentRelativePath = Paths.get(""); String currentPath = currentRelativePath.toAbsolutePath().toString(); String csvFile = currentPath + "/pathInYourProject/test.csv"; Reader in; Iterable records = null; try { in = new FileReader(csvFile); records = CSVFormat.EXCEL.withHeader().parse(in); // header will be ignored } catch (IOException e) { e.printStackTrace(); } for (CSVRecord record : records) { String line = ""; for ( int i=0; i < record.size(); i++) { if ( line == "" ) line = line.concat(record.get(i)); else line = line.concat("," + record.get(i)); } System.out.println("read line: " + line); } 

它自动识别 但不是; (也许它可以配置......)。

我的示例文件是:

 col1,col2,col3 val1,"val2",val3 "val4",val5 val6;val7;"val8" 

输出是:

 read line: val1,val2,val3 read line: val4,val5 read line: val6;val7;"val8" 

最后一行被视为一个值。

要阅读一些特定的专栏,我做了类似的事情:

 dpkcs.csv content: FN,LN,EMAIL,CC Name1,Lname1,email1@gmail.com,CC1 Nmae2,Lname2,email2r@gmail.com,CC2 

读取它的function:

 private void getEMailRecepientList() { List emailList = null;// Blank list of POJO class Scanner scanner = null; BufferedReader reader = null; try { reader = new BufferedReader(new FileReader("dpkcs.csv")); Map mailHeader = new HashMap(); // read file line by line String line = null; int index = 0; line = reader.readLine(); // Get header from 1st row of csv if (line != null) { StringTokenizer str = new StringTokenizer(line, ","); int headerCount = str.countTokens(); for (int i = 0; i < headerCount; i++) { String headerKey = str.nextToken(); mailHeader.put(headerKey.toUpperCase(), new Integer(i)); } } emailList = new ArrayList(); while ((line = reader.readLine()) != null) { // POJO class for getter and setters EmailRecepientData email = new EmailRecepientData(); scanner = new Scanner(line); scanner.useDelimiter(","); //Use Specific key to get value what u want while (scanner.hasNext()) { String data = scanner.next(); if (index == mailHeader.get("EMAIL")) email.setEmailId(data); else if (index == mailHeader.get("FN")) email.setFirstName(data); else if (index == mailHeader.get("LN")) email.setLastName(data); else if (index == mailHeader.get("CC")) email.setCouponCode(data); index++; } index = 0; emailList.add(email); } reader.close(); } catch (Exception e) { StringWriter stack = new StringWriter(); e.printStackTrace(new PrintWriter(stack)); } finally { scanner.close(); } System.out.println("list--" + emailList); } 

POJO课程:

 public class EmailRecepientData { private String emailId; private String firstName; private String lastName; private String couponCode; public String getEmailId() { return emailId; } public void setEmailId(String emailId) { this.emailId = emailId; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getCouponCode() { return couponCode; } public void setCouponCode(String couponCode) { this.couponCode = couponCode; } @Override public String toString() { return "Email Id=" + emailId + ", First Name=" + firstName + " ," + " Last Name=" + lastName + ", Coupon Code=" + couponCode + ""; } } 

我们可以单独使用核心java东西来逐列读取CVS文件。 这是我为我的要求编写的示例代码。 我相信它会对某些人有所帮助。

  BufferedReader br = new BufferedReader(new FileReader(csvFile)); String line = EMPTY; int lineNumber = 0; int productURIIndex = -1; int marketURIIndex = -1; int ingredientURIIndex = -1; int companyURIIndex = -1; // read comma separated file line by line while ((line = br.readLine()) != null) { lineNumber++; // use comma as line separator String[] splitStr = line.split(COMMA); int splittedStringLen = splitStr.length; // get the product title and uri column index by reading csv header // line if (lineNumber == 1) { for (int i = 0; i < splittedStringLen; i++) { if (splitStr[i].equals(PRODUCTURI_TITLE)) { productURIIndex = i; System.out.println("product_uri index:" + productURIIndex); } if (splitStr[i].equals(MARKETURI_TITLE)) { marketURIIndex = i; System.out.println("marketURIIndex:" + marketURIIndex); } if (splitStr[i].equals(COMPANYURI_TITLE)) { companyURIIndex = i; System.out.println("companyURIIndex:" + companyURIIndex); } if (splitStr[i].equals(INGREDIENTURI_TITLE)) { ingredientURIIndex = i; System.out.println("ingredientURIIndex:" + ingredientURIIndex); } } } else { if (splitStr != null) { String conditionString = EMPTY; // avoiding arrayindexoutboundexception when the line // contains only ,,,,,,,,,,,,, for (String s : splitStr) { conditionString = s; } if (!conditionString.equals(EMPTY)) { if (productURIIndex != -1) { productCVSUriList.add(splitStr[productURIIndex]); } if (companyURIIndex != -1) { companyCVSUriList.add(splitStr[companyURIIndex]); } if (marketURIIndex != -1) { marketCVSUriList.add(splitStr[marketURIIndex]); } if (ingredientURIIndex != -1) { ingredientCVSUriList.add(splitStr[ingredientURIIndex]); } } } } 

那么,这个怎么样!!

此代码计算csv文件中的行数和列数。 试试吧!!

  static int[] getRowsColsNo() { Scanner scanIn = null; int rows = 0; int cols = 0; String InputLine = ""; try { scanIn = new Scanner(new BufferedReader( new FileReader("filename.csv"))); scanIn.useDelimiter(","); while (scanIn.hasNextLine()) { InputLine = scanIn.nextLine(); String[] InArray = InputLine.split(","); rows++; cols = InArray.length; } } catch (Exception e) { System.out.println(e); } return new int[] { rows, cols }; } 

查找文件夹中的所有文件并将该数据写入ArrayList行。

初始化

 ArrayList> row=new ArrayList>(); BufferedReader br=null; 

用于访问行

 for(ArrayList data:row){ data.get(col no); } or row.get(0).get(0) // getting first row first col 

从文件夹读取所有文件并将它们连接起来的函数。

 static void readData(){ String path="C:\\Users\\Galaxy Computers\\Desktop\\Java project\\Nasdaq\\"; File files=new File(path); String[] list=files.list(); try { String sCurrentLine; char check; for(String filename:list){ br = new BufferedReader(new FileReader(path+filename)); br.readLine();//If file contains uneccessary first line. while ((sCurrentLine = br.readLine()) != null) { row.add(splitLine(sCurrentLine)); } } } } catch (IOException e) { e.printStackTrace(); } try { if (br != null)br.close(); } catch (IOException ex) { ex.printStackTrace(); } } static ArrayList splitLine(String line){ String[] ar=line.split(","); ArrayList d=new ArrayList(); for(String data:ar){ d.add(data); } return d; }