簡體   English   中英

從不同的路徑制作逗號分隔的列表

[英]Make comma separated list from different paths

我在多行中有如下路徑列表。

abc/xyz/../a1.txt
abc/xyz/../a2.txt
abc/xyz/../a3.txt
abc1/xyz/../a4.txt
abc1/xyz/../a5.txt
abc1/xyz/../a6.txt

我想刪除所有路徑並僅提取文件名,如下所示

"a1.txt","a2.txt","a3.txt"

"a4.txt","a5.txt","a6.txt"

請幫助我。

假設路徑列表存儲在一個字符串中:

var paths= "abc/xyz/../a1.txt"
           + "\n" + "abc/xyz/../a2.txt"
           + "\n" + "abc/xyz/../a3.txt"
           + "\n" + "abc1/xyz/../a4.txt"
           + "\n" + "abc1/xyz/../a5.txt"
           + "\n" + "abc1/xyz/../a6.txt";

您只需要按行拆分並將每個條目減少到文件名(例如,使用正則表達式):

var fileNamePattern = /[^\/]+$/;
var fileNames = paths.split("\n").map(function (entry) {
    return fileNamePattern.exec(entry)[0];
}

有關如何使用正則表達式的更多信息,請查看此鏈接在這里您可以找到如何使用 map 方法。

更新

在這里你可以找到一個例子

假設這是 string ,首先使用split為字符串中的換行符在數組中存儲不同的路徑:

arr = str.split(/\n/);

然后遍歷數組並使用pop將文件名存儲在另一個數組中(比如 file_names):

file_names.push(arr[i].split('/').pop())

您可以使用正則表達式將帶有路徑的多行字符串轉換為一個對象,該對象將具有每個文件夾的文件名數組,其中文件夾名稱用作對象的屬性名稱:

// Test data, with some border cases:
var paths = " abc/xyz/../a1.txt\n" +
            "abc/xyz/../a2.txt\r\n" +
            "   \n" +
            " no-folder.txt \n" +
            "abc/xyz/../a3.txt     \n" +
            "   abc1/xyz/../a4.txt\n" +
            "abc1/xyz/../a5.txt\n" +
            "abc1/xyz/../a6.txt\n" +
            "   ";
var filesPerFolder = paths.split(/\r\n|\n/).reduce(function (filesPerFolder, path) {
    path = path.trim();
    if (path.length) {
        var folder = path.replace(/[^\/]*$/, '');
        (filesPerFolder[folder] = filesPerFolder[folder] || []).
            push(path.substr(folder.length));
    }
    return filesPerFolder;
}, {});

filesPerFolder將是

{
    "abc/xyz/../": [
        "a1.txt",
        "a2.txt",
        "a3.txt"
    ],
    "": [
        "no-folder.txt"
    ],
    "abc1/xyz/../": [
        "a4.txt",
        "a5.txt",
        "a6.txt"
    ]
}

上面的代碼:

  • 識別LFCRLF換行符
  • 跳過路徑周圍的空白
  • 跳過空行
  • 可以處理文件名沒有文件夾前綴的行

這是一個小提琴,您可以在其中鍵入列表作為輸入,按 Go 按鈕並查看Json編碼的filesPerFolder

有很多方法可以處理該對象。 例如,您可以按如下方式打印內容:

Object.keys(filesPerFolder).forEach(function(folder) {
    console.log('Contents of folder "' + folder + '": '
        + JSON.stringify(filesPerFolder[folder]));
});

這將輸出(使用上面的示例數據):

Contents of folder "abc/xyz/../": ["a1.txt","a2.txt","a3.txt"]
Contents of folder "": ["no-folder.txt"]
Contents of folder "abc1/xyz/../": ["a4.txt","a5.txt","a6.txt"]

或者,如果您想打印帶有前綴文件夾的每個文件(這將是輸入的干凈版本):

Object.keys(filesPerFolder).forEach(function(folder) {
    filesPerFolder[folder].forEach(function(file) {
        console.log(folder + file);
    });
});

輸出:

abc/xyz/../a1.txt
abc/xyz/../a2.txt
abc/xyz/../a3.txt
no-folder.txt
abc1/xyz/../a4.txt
abc1/xyz/../a5.txt
abc1/xyz/../a6.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM