【问题标题】:Parsing filename to extract String parts in Java解析文件名以提取 Java 中的字符串部分
【发布时间】:2021-04-12 14:23:17
【问题描述】:

我需要从具有以下扩展名的文件夹(文件)中的每个文件中提取字符串部分,例如 png、jpg、jpeg、PNG、JPG、JPEG。 文件命名约定如下(这是 2 个不同的文件,但它们唯一的共同点是获取 FILENAME 所需的 TIMESTAMP:

AIRLINECODE_PARTNERCODE_INVOICENO_timestamp.FILETYPE FILENAME.FILETYPE_timestamp

示例文件名:

ET_PRH_4_20170309140404.png

gosalyn.png_20170309140404

从第一个读取字段后,我需要将每个大写字段写入数据库(例如 AIRLINECODE、PARTNERCODE 到 db 中的列)。 以下是我到目前为止编写的代码,请您指导我如何从这里开始。您的帮助将不胜感激。我只需要拆分和存储部分的帮助。谢谢

import java.io.File;
import java.io.FilenameFilter;

public class Pathnames {
    
    public void readFilename() {
        // try-catch block to handle exceptions
        try {
            File f = new File("C:\\Users\\rsaeed\\Desktop\\files");

            FilenameFilter filter = new FilenameFilter() {
                @Override
                public boolean accept(File f, String name) {
                    return name.endsWith(".png") || name.endsWith(".PNG") || name.endsWith(".jpg") || name.endsWith(".JPG") || name.endsWith(".jpeg") || name.endsWith(".JPEG");
                }
            };

            // using a File class as an array
            File[] files = f.listFiles(filter);
            if(files != null) {
                for(File eachFile : files) {
                    String[] partsOfName = eachFile.split("_"); // this part is wrong. I am stuck here
                }
            }

            
            // Get the names of the files by using the .getName() method
            for (int i = 0; i < files.length; i++) {
                System.out.println(files[i].getName());
            }
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
    }
    
    
    public static void main(String args[]) {
        
        Pathnames p = new Pathnames();
        p.readFilename();
    }
}

【问题讨论】:

  • 您遇到的“具体”问题是什么?
  • @OldProgrammer 我可以从文件夹中获取文件名,但是对于每个文件,我需要根据上面描述的内容将其拆分并将其写入数据库。稍后会先写入 db 部分,我需要拆分并存储特定字段(大写的字段)。
  • @OldProgrammer 你明白了吗,还是你认为我需要进一步解释?
  • 所以您只对大写字母感兴趣?它们可以在字符串中出现多次吗?还是他们总是在开始?
  • 也许您可以使用模式来提取部分,第 1 组具有大写文件名,您可以在 _ 上拆分并检查第 2 组和第 3 组是否存在并获取时间戳^([A-Z]+(?:_[A-Z]+)*).*(?:_(\d+)\.(?:png|jpe?g|PNG|JPE?G)|\.(?:png|jpe?g|PNG|JPE?G)_(\d+))$ 见@ 987654321@

标签: java parsing split


【解决方案1】:

您需要在 fileName、String 对象而不是 File 对象上调用 split 方法。
拆分时使用_.,这样文件扩展名也会被分开:

String fileName = "ET_PRH_4_20170309140404.png";
String[] parts = fileName.split("_|\\.");
System.out.println(Arrays.toString(parts));

输出:

[ET, PRH, 4, 20170309140404, png]

现在您可以轻松地从阵列中获取零件。
有关模式的更多信息,请参阅Pattern 类文档。

对于每个文件,您可以这样做:

for(File eachFile : files) {
    String[] partsOfName = eachFile.file.getName().split("_|\\."); 
    final String timestamp = parts[3];
    //create a filter with `name.contains(timestamp)`
    //and execute f.listFiles again to get the related files.
}

【讨论】:

  • 是的,您的解决方案看起来不错,但我需要为“文件”文件夹中的每个文件执行此操作,这就是为什么我尝试使用 for 循环遍历“文件”中的“每个文件” .你能提供一个解决方案吗?
  • 另外我如何比较两个具有相似时间戳的文件并使用它来获取文件名?就像可以在这段代码中完成的任何事情一样
  • 您的过滤器仅搜索带有图像扩展名的文件。获得时间戳后,您必须再次搜索名称中包含时间戳的文件。我已将逻辑添加到答案中。或者修改你的过滤器为name.contains("\\.png") 并在数组中做时间戳搜索。
猜你喜欢
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
相关资源
最近更新 更多