从CSV文件中读取数据,使用逗号','分割问题

本文介绍了一种Java实现的CSV文件读取方法,并详细解释了如何正确处理包含逗号的字段,确保数据准确无误地被解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. package Test;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileReader;  
  6. import java.io.IOException;  
  7. import java.io.PrintWriter;  
  8. import java.io.UnsupportedEncodingException;  
  9.   
  10. public class ReadCSV_major {  
  11.       
  12.     public static void main(String [] args){  
  13.         ReadCSV_major read = new ReadCSV_major();  
  14.         read.run();  
  15.     }  
  16.     public void run(){  
  17.         String csv = "/Users/huazhe/Desktop/项目数据/Professors.csv";  
  18.         BufferedReader br = null;  
  19.         String line ="";  
  20.         String csvSplitBy = ",(?=([^\"]*\"[^\"]*\")*[^\"]*$)";  
  21.           
  22.         //where should we save  
  23.         String path_file = "/Users/huazhe/Desktop/项目数据/major.txt";  
  24.           
  25.         PrintWriter writer_path = null;  
  26.           
  27.         try {  
  28.             writer_path = new PrintWriter(path_file,"UTF-8");  
  29.             br = new BufferedReader(new FileReader(csv));  
  30.             while((line = br.readLine()) != null){  
  31.                   
  32.                 //use comma as separatpr  
  33.                 String [] major = line.split(csvSplitBy);  
  34.                 System.out.println("major"+major[5]);  
  35.             }  
  36.               
  37.         } catch (FileNotFoundException e) {  
  38.           
  39.             e.printStackTrace();  
  40.         } catch (UnsupportedEncodingException e) {  
  41.               
  42.             e.printStackTrace();  
  43.         } catch (IOException e) {  
  44.             // TODO Auto-generated catch block  
  45.             e.printStackTrace();  
  46.         }  
  47.           
  48.           
  49.     }  
  50. }  


上述代码功能是读取数据从csv文件。

当大家进行这一操作的时候通常会遇到如下问题。

1: 想分割数据 例如:

"123","Jack jona","Computer science"

"234","Joen Dan", "Philosophy"

//当遇到这种数据的时候可直接用  逗号进行分割。

2: 分割数据如下:

"123", "jack jona", "New York, NY"

"234", "Lee Jack", "Fort myers, FL"

//当遇到这种数据的时候可以直接使用 

[java]  view plain  copy
  1. ,(?=([^\"]*\"[^\"]*\")*[^\"]*$)  
//进行分割。 这种的好处是只对引号外面的逗号进行分割,对引号内的不分割。

//简单的说这种分割得出的结果是

123 jack jona New York, NY

234 Lee Jack Fort myers, FL

//简单使用逗号分割结果是

123 jack jona New York NY

234 Lee jack Fort myers FL

在MFC中,读取CSV文件并按逗号进行分割通常会涉及使用流(fstream)和字符串流(stringstream),因为MFC本身不直接支持CSV解析。下面是一个简单的步骤说明: 1. **打开文件**: 使用`CFile`类打开CSV文件,确保正确指定文件路径和模式(如"rb"代表二进制读取)。 ```cpp CFile file("your_file.csv", CFile::modeRead); if (!file.IsOpen()) { // 文件无法打开,处理错误 } ``` 2. **读取数据**: 创建一个字符串流,然后逐行读取文件内容到其中。 ```cpp std::string line; while (!file.ReadString(line)) { if (file_eof(file)) break; // 文件结束 } ``` 3. **分割每一行**: 使用`std::getline`将每行拆分为单独的字段,并用`std::stringstream`按逗号分割每个字段。 ```cpp std::stringstream ss(line); std::vector<std::string> fields; std::string field; while (std::getline(ss, field, ',')) { fields.push_back(field); } ``` 4. **处理结果**: 现在`fields`向量里存储了按逗号分割的字段,你可以进一步处理这些数据。 ```cpp for (const auto& field : fields) { // 这里可以做你想做的事情,比如打印、存储到其他结构等 } ``` 5. **关闭文件**: 当完成所有处理后,别忘了关闭文件。 ```cpp file.Close(); ``` 注意,这个例子假设CSV文件没有特殊字符,如果包含引号或其他转义字符,可能需要更复杂的解析策略,甚至考虑使用专门的CSV解析库,如`picojson`或`csv-parser`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值