代码之家  ›  专栏  ›  技术社区  ›  Piccolo

使用opencsv读取远程.csv文件

  •  9
  • Piccolo  · 技术社区  · 12 年前

    我已经思考了相当长的一段时间了。我正在尝试从下载数据 Yahoo!'s Stock API 。当您使用API时,它会为您提供 .csv 文件我一直在看opencsv,它看起来很完美,除了 我想避免 downloading and saving the file ,如果可能的话 .

    OpenCSV,根据 examples ,只能从 FileReader 。根据甲骨文的 docs on FileReader ,文件需要是本地的。


    是否可以在不下载的情况下使用OpenCSV从远程文件读取?

    2 回复  |  直到 7 年前
        1
  •  17
  •   FThompson    8 年前

    CSVReader 拿一个 Reader 根据 the documentation ,所以 不是 限于 FileReader 用于参数。

    使用 CSV阅读器 在不首先保存文件的情况下,可以使用 BufferedReader 围绕加载数据的流:

    URL stockURL = new URL("http://example.com/stock.csv");
    BufferedReader in = new BufferedReader(new InputStreamReader(stockURL.openStream()));
    CSVReader reader = new CSVReader(in);
    // use reader
    
        2
  •  0
  •   Ravi    5 年前

    opencsv的实现,用于读取csv文件并保存到数据库。

    import com.opencsv.CSVParser;
    import com.opencsv.CSVParserBuilder;
    import com.opencsv.CSVReader;
    import com.opencsv.CSVReaderBuilder;
    import com.opencsv.bean.CsvBindByPosition;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import javax.persistence.Column;
    import java.io.*;
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    
    @Service
    @Slf4j
    public class FileUploadService {
    
        @Autowired
        private InsertCSVContentToDB csvContentToDB;
    
    
        /**
         * @param csvFileName location of the physical file.
         * @param type Employee.class
         * @param delimiter  can be , | # etc
         * @param obj    //new Employee();
         *
         *            import com.opencsv.bean.CsvBindByPosition;
         *            import lombok.Data;
         *
         *            import javax.persistence.Column;
         *
         *              @Data
         *              public class Employee {
         *
         *              @CsvBindByPosition(position = 0, required = true)
         *              @Column(name = "EMPLOYEE_NAME")
         *              private String employeeName;
         *
         *              @CsvBindByPosition(position = 1)
         *              @Column(name = "Employee_ADDRESS_1")
         *              private String employeeAddress1;
         *          }
         *
         * @param sqlQuery  query to save data to DB
         * @param noOfLineSkip make it 0(Zero) so that it should not skip any line.
         * @param auditId apart from regular column in csv we need to add more column for traking like file id or audit id
         * @return
         */
        public <T> void readCSVContentInArray(String csvFileName, Class<? extends T> type, char delimiter, Object obj,
                                                      String sqlQuery, int noOfLineSkip, Long auditId) {
            List<T> lstCsvContent = new ArrayList<>();
            Reader reader = null;
            CSVReader csv = null;
            try {
                reader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFileName), "utf-8"));
                log.info("Buffer Reader : " + ((BufferedReader) reader).readLine().isEmpty());
                CSVParser parser = new CSVParserBuilder().withSeparator(delimiter).withIgnoreQuotations(true).build();
                csv = new CSVReaderBuilder(reader).withSkipLines(noOfLineSkip).withCSVParser(parser).build();
                String[] nextLine;
                int size = 0;
                int chunkSize = 10000;
                Class params[] = { Long.class };
                Object paramsObj[] = { auditId };
                long rowNumber = 0;
                Field field[] = type.getDeclaredFields();
                while ((nextLine = csv.readNext()) != null) {
                    rowNumber++;
                    try {
    
                        obj = type.newInstance();
    
                        for (Field f : field) {
                            if(!f.isSynthetic()){
                                f.setAccessible(true);
                                Annotation ann[] = f.getDeclaredAnnotations();
                                CsvBindByPosition csv1 = (CsvBindByPosition) ann[0];
                                Column c = (Column)ann[1];
    
                                try {
                                    if (csv1.position() < nextLine.length) {
                                        if (csv1.required() && (nextLine[csv1.position()] == null
                                                || nextLine[csv1.position()].trim().isEmpty())) {
                                            String message = "Mandatory field is missing in row: " + rowNumber;
                                            log.info("null value in " + rowNumber + ", " + csv1.position());
                                            System.out.println(message);
    
                                        }
    
                                        if (f.getType().equals(String.class)) {
                                            f.set(obj, nextLine[csv1.position()]);
    
                                        }
                                        if (f.getType().equals(Boolean.class)) {
                                            f.set(obj, nextLine[csv1.position()]);
    
                                        }
                                        if (f.getType().equals(Integer.class)) {
                                            f.set(obj, Integer.parseInt(nextLine[csv1.position()]));
    
                                        }
                                        if (f.getType().equals(Long.class)) {
                                            f.set(obj, Long.parseLong(nextLine[csv1.position()]));
                                        }
                                        if (f.getType().equals(Double.class) && null!=nextLine[csv1.position()] && !nextLine[csv1.position()].trim().isEmpty()  ) {
                                            f.set(obj, Double.parseDouble(nextLine[csv1.position()]));
    
                                        }if(f.getType().equals(Double.class) && ((nextLine[csv1.position()]==null) || nextLine[csv1.position()].isEmpty())){
                                            f.set(obj, new Double("0.0"));
                                        }
                                        if (f.getType().equals(Date.class)) {
                                            f.set(obj, nextLine[csv1.position()]);
                                        }
                                    }
                                } catch (Exception fttEx) {
                                    log.info("Exception when parsing the file: " + fttEx.getMessage());
                                    System.out.println(fttEx.getMessage());
                                }
                            }
                        }
                        lstCsvContent.add((T) obj);
                        if (lstCsvContent.size() > chunkSize) {
                            size = size + lstCsvContent.size();
                            //write code to save to data base of file system in chunk.
                            lstCsvContent = null;
                            lstCsvContent = new ArrayList<>();
                        }
    
                    } catch (Exception ex) {
                        log.info("Exception: " + ex.getMessage());
                    }
    
                }
                //write code to save list into DB or file system
                System.out.println(lstCsvContent);
            } catch (Exception ex) {
                log.info("Exception:::::::: " + ex.getMessage());
    
            } finally {
                try {
                    if (csv != null) {
                        csv.close();
                    }
                    if (reader != null) {
                        reader.close();
                    }
                } catch (IOException ioe) {
    
                    log.info("Exception when closing the file: " + ioe.getMessage());
                }
            }
            log.info("File Processed successfully: ");
        }
    
    
    }