java - 搜索目录中的文件并根据公共(public)子字符串将它们配对

标签 java regex replace imagej

我一直在尝试为 ImageJ 编写一个解决方案来处理我的图像。

我了解如何获取目录,在其上运行命令等。但是,我遇到了一种情况,我现在需要开始使用某种类型的搜索功能,以便将两个图像在一个完整的目录中配对在一起图像对。

我希望你们能够确认我的方向是正确的,我的想法是正确的。到目前为止,这对我来说还是很难理解,因为我的 Java 经验还不到一个月。由于这个项目直接用于我的研究,我确实有足够的动力来完成它,我只需要一些关于哪些功能对我有用的指导。

我最初考虑使用正则表达式,但我发现当你开始处理大量图像时(特别是使用 imagej,它似乎不能很好地转储数据使用情况,如果这是正确的说法的话)regex is very slow .

这些图像的一般格式是:

  • someString_DAPI_0001.tif
  • someString_GFP_0001.tif
  • someString_DAPI_0002.tif
  • someString_GFP_0002.tif
  • someString_DAPI_0003.tif
  • someString_GFP_0003.tif

它们按字母顺序排列,因此应该能够转到列表中的下一个图像。我只是有点不知道应该使用哪些函数来完成此任务,但我认为我的整体 while 结构是正确的。感谢 Java 论坛的一些帮助。然而我仍然不知道下一步该去哪里。

到目前为止,这是我的代码:感谢 this SO部分代码的答案

int count = 0;
getFile("C:\");

string DAPI;
string GFP;


private void getFile(String dirPath) {
    File f = new File(dirPath);
    File[] files = f.listFiles();

    while (files.length > 0) {
        if (/* File name contains "DAPI"*/){
            DAPI = File f;
            string substitute to get 'GFP' filename
            store GFP file name into variable
            do something(DAPI, GFP);
        }
        advance to next filename in list
    }
}

到目前为止,我真的不知道如何在字符串中搜索字符串。我见过正则表达式捕获组和其他解决方案,但我不知道处理数百张图像的“最佳”解决方案。

我也不知道用什么函数来替换子字符串。

如果你们能指出最适合这种情况的功能,我将非常感激。我喜欢弄清楚如何自己制作,我只需要帮助获取正确的信息。还想确保我在这里没有犯重大逻辑错误。

最佳答案

如果您的文件名遵循您提到的简单模式,那么您似乎不需要正则表达式。您可以简单地迭代文件并根据文件名是否包含 DAPI 进行过滤,例如见下文。此代码可能过于简化了您的要求,但根据您提供的详细信息我无法判断这一点。

import java.io.*;


public class Temp {

  int count = 0;

  private void getFile(String dirPath) {
    File f = new File(dirPath);
    File[] files = f.listFiles();

    if (files != null) {
      for (File file : files) {
        if (file.getName().contains("DAPI")) {
          String dapiFile = file.getName();
          String gfpFile = dapiFile.replace("DAPI", "GFP");
          doSomething(dapiFile, gfpFile);
        }
      }
    }
  }

  //Do Something does nothing right now, expand on it.
  private void doSomething(String dapiFile, String gfpFile) {
    System.out.println(new File(dapiFile).getAbsolutePath());
    System.out.println(new File(gfpFile).getAbsolutePath());
  }

  public static void main(String[] args) {
    Temp app = new Temp();
    app.getFile("C:\\tmp\\");
  }

}

注意:根据 Vogel612 的回答,如果您有 Java 8 并且喜欢功能性解决方案,您可以拥有:

private void getFile(String dirPath) {
  try {
    Files.find(Paths.get(dirPath), 1, (path, basicFileAttributes) -> (path.toFile().getName().contains("DAPI"))).forEach(
      dapiPath -> {
        Path gfpPath = dapiPath.resolveSibling(dapiPath.getFileName().toString().replace("DAPI", "GFP"));
        doSomething(dapiPath, gfpPath);
      });
  } catch (IOException e) {
    e.printStackTrace();
  }
}

//Dummy method does nothing yet.
private void doSomething(Path dapiPath, Path gfpPath) {
  System.out.println(dapiPath.toAbsolutePath().toString());
  System.out.println(gfpPath.toAbsolutePath().toString());
}

关于java - 搜索目录中的文件并根据公共(public)子字符串将它们配对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33680226/

相关文章:

java - 如何为 JBCO(Java ByteCode Obfuscator)指定入口点类和 jar 存档?

regex - Vim 正则表达式 : Match until blank line

javascript - 如何解析字符串

java - 在手机的 JME 应用程序中使用 -Xmx 和 -Xms

java - 将泛型类型对象写入 java 文件

javascript - 修改正则表达式以允许负数

regex - 如何匹配包含子字符串的模式

search - vim、ed 或 sed 对给定文件进行多次搜索和替换

将 'qualify' 列值 'yes' 和 'no' 替换为 True 和 False 的 Python 程序

java - SQLite Java和sqlite4java