【问题标题】:How to read data from multiple .csv files with similar names? [duplicate]如何从多个具有相似名称的 .csv 文件中读取数据? [复制]
【发布时间】:2015-12-04 05:32:29
【问题描述】:

我在一个包含许多其他文件的文件夹中有多个以CUSTOMER_YYYYMMDD.csv 开头的文件(每个文件都有自己的日期)。我的脚本(使用BufferedReader)已经可以从一个具体文件中读取数据,但我想从只命名为CUSTOMER_YYYYMMDD.csv 的文件中获取数据,但我不知道该怎么做。

这是我得到的:

public static void main(String[] args) 
{

    BufferedReader br = null;

    try {

        String line;

        br = new BufferedReader(new FileReader("/Users/ovshievb/Desktop/IP/data/tcos/INPUT/CUSTOMER_20150401.csv"));

        //Nacita hlavicku CSV failu aby ji preskocit
        br.readLine();

        // Cteni failu radek po radku
        while ((line = br.readLine()) != null) {
        //  System.out.println("Raw CSV data: " + line);
            System.out.println("Customer: " + csvToArray(line) + "\n");
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (br != null) br.close();
        } catch (IOException exception) {
            exception.printStackTrace();
        }
    }
}

【问题讨论】:

标签: java csv filereader


【解决方案1】:

试试这个:

SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
    File folder = new File("/Users/ovshievb/Desktop/IP/data/tcos/INPUT/");
    for(File file: folder.listFiles()){
        String name = file.getName();
        if(name.startsWith("CUSTOMER_")){
            String date = name.replace("CUSTOMER_", "");
            BufferedReader br = null;
            try{
                String line;

                df.parse(date);
                br = new BufferedReader(new FileReader("/Users/ovshievb/Desktop/IP/data/tcos/INPUT/"+ name));

                //Nacita hlavicku CSV failu aby ji preskocit
                br.readLine();

                // Cteni failu radek po radku
                while ((line = br.readLine()) != null) {
                //  System.out.println("Raw CSV data: " + line);
                    System.out.println("Customer: " + csvToArray(line) + "\n");
                }
            }catch(ParseException ex){
                // Wrong date format.
            } finally {
                br.close();
            }
        }
    }

【讨论】:

  • 我想你的意思是String name = file.getName();。另外,我们不要鼓励新开发人员捕获通用异常。
  • 谢谢,我更新了答案。
【解决方案2】:

首先获取文件夹中的所有 CSV 文件。然后递归地读取它们。下面给出了获取文件夹中所有 CSV 文件的示例代码。

 public static List<String> parseForCsvFiles(String parentDirectory){
    File[] filesInDirectory = new File(parentDirectory).listFiles();
    List<String> fileList = new ArrayList<String>();
    for(File f : filesInDirectory){
        if(f.isDirectory()){
            parseForCsvFiles(f.getAbsolutePath());
        }
        String filePath = f.getAbsolutePath();
        String fileExtenstion = filePath.substring(filePath.lastIndexOf(".") + 1,filePath.length());
        if("csv".equals(fileExtenstion)){
            //add to a list or array
            fileList.add(filePath);
        }

    }       
  return fileList;
}

【讨论】:

    【解决方案3】:

    首先,您应该获得目录中所有文件的列表。这可以通过创建目录的文件对象然后调用list() 方法来完成。

    File myDirectory = new File(/path/to/my/dir/);
    String[] containingFileNames = myDirectory.list();
    

    之后,您可以遍历所有文件名并检查名称是否与模式 CUSTOMER_YYYYMMDD.csv 匹配

    for (String fileName : containingFileNames) {
       if (fileName.matches("CUSTOMER_\\d*.csv") {
          // Read this file with the BufferedReader like in your code above
       }
    }
    

    【讨论】:

    • 正确答案,但检查 FileNameFilter,将 accept 添加到类 if (fileName.matches("CUSTOMER_\\d*.csv") return true; 会更干净;)
    • 或者更干净,return (fileName.matches("CUSTOMER_\\d*.csv");,如果你想这样做的话。
    • fileName.matches("CUSTOMER_\\d*.csv") 将为名为 CUSTOMER_999999999999.csv 的文件返回 true,该文件不符合最后一部分是日期的要求。
    • 由于 OP 想要“以 CUSTOMER_ 开头”的文件的解决方案,这符合要求。如果检查应该包含正确的日期格式,OP 可能会查看Regular Expressions
    • 如果要求是“从 CUSTOMER_ 开始”,则在您的解决方案中使用 \\d* 是没有用的。此外,@Schlangguru 确保在您投票否决解决方案时添加对解决方案的评论。 :)
    【解决方案4】:

    您可以使用File#listFiles(FilenameFilter) 获取文件夹/目录中文件的过滤列表。只需提供过滤器的实现 - 您可以根据正则表达式检查文件名。

    【讨论】:

      【解决方案5】:

      将上面的代码块变成一个方法,该方法接受一个参数来读取文件名。然后你所要做的就是为你想读取的任何其他文件调用你的方法。

      【讨论】:

        猜你喜欢
        • 2021-10-09
        • 1970-01-01
        • 1970-01-01
        • 2019-07-08
        • 1970-01-01
        • 1970-01-01
        • 2021-09-24
        • 1970-01-01
        • 2011-02-05
        相关资源
        最近更新 更多