脚本对所有基于 utf8 的文件进行迭代并根据找到的内容重命名它们

脚本对所有基于 utf8 的文件进行迭代并根据找到的内容重命名它们

您可以跳过下面的内容,它是为我正在尝试做的事情提供一些背景的序言:

我有很多文件,它们是不同城市的 Nasa 卫星 (MERRA-2) 的数据点。当我使用 wget 批量下载它们时,它们都带有固定名称,并将扩展名更改为.1 .2 .3[...]。如果我尝试在 wget 命令行中强制重命名它(比如说,重命名为它对应的城市的名称),它会以某种方式破坏文件/数据结构(它是一个.csv

因此,我只是以默认方式下载,然后使用批量重命名实用程序进行批量重命名(更改 for.1 .2 .3并将.csv前缀从 1 改为 x)

现在我必须将每个文件重命名为其对应的城市和年份。我编写了一个简单的 JavaScript 来生成 ren 命令提示符,以便在生成 wget 下载链接时执行此操作,它在测试中运行良好。

我的问题是,总共 2961 个文件,每个文件都有 1.6Mb,下载需要 55 分钟(每秒下载 500 字节),所以我必须让它连夜下载。第二天我发现下载已经完成,但 141 个城市中只有 100 个被下载了。这种情况每天都在发生,问题似乎出在 Nasa 服务器上。该项目的其他合作伙伴表示,他们也看到了这些速度……从 500 字节到 2kbps……

随机城市下载失败导致我的 ren 脚本毫无用处。

现在我有一堆.csv同名文件(仅前缀从 1 到 100 不同),我需要用城市名称重命名它们。要知道给定文件对应的城市,唯一的方法是打开它并查找纬度数据,然后参考我这里的另一个表。


我需要构建一个命令行脚本,对.txt文件夹内的所有文件进行迭代,找到纬度-3.58035,然后将该文件重命名为CITYNAME,将其格式从更改为.txt.csv或者至少将其维护为.txt

有了这个脚本,我可以编写一些 JS 来生成更多脚本,根据我拥有的 141 个不同纬度中的每一个来更改所有文件的名称。

以下是文件内容的示例:

时间、纬度[单位="北纬度"]、经度[单位="东经度"]、BCSMASS[单位="千克米-3"]、DUSMASS[单位="千克米-3"]、DUSMASS25[单位="千克米-3"]、OCSMASS[单位="千克米-3"]、SO4SMASS[单位="千克米-3"]、SSSMASS[单位="千克米-3"]、SSSMASS25[单位="千克米-3"] 2000-01-01T00:30:00Z,-3.58035,-59.1315,2.800106813083403E-10,3.508830559439957E-9,9.654286259319633E-10,3.5261109587736428E-9,2.061603110448118E-10,3.2207483902091383E-10,8.28777324546337E-11

在这种情况下,-3.58035是纬度。

有人能帮我解决这个问题吗?

答案1

我最终自己使用 JS/NodeJS 完成了这件事:

const fs = require('fs')

//the Dict was much bigger, I've cut it down for this answer
//also, I had to include the "," before and after the key, because one of
//the cities had lat -2.86 and another -2.8611, and that was kinda breaking it.

var latsDict = {
    ",-3.58035,":"AUTAZES",
    ",-3.81212,":"CAREIRO",
    ",-3.19815,":"CAREIRO DA VÁRZEA",
    ",-3.20113,":"IRANDUBA",
    ",-3.14198,":"ITACOATIARA"
}
var latsLen = Object.keys(latsDict).length
var year = 2010
var directory = `/Users/Misharin/Desktop/Nasa/${year}/`

fs.readdir(directory, function (err, files) {
    if (err) {
        console.log(err)
        return
    }
    files.forEach(function (file) {
        fs.readFile(`${directory}${file}`, 'utf8', function (err, data) {
            if (err) {
                console.log(err)
                return
            }
            for (var i = 0; i <= latsLen; i++){
                var currentLatKey = Object.keys(latsDict)[i]
                var currentLatValue = Object.values(latsDict)[i]
                if(data.includes(currentLatKey)){
                    console.log(`${file}\t${currentLatValue}`)
                    fs.rename(`${directory}${file}`, `${directory}${currentLatValue.replace(/\s+/g,'-').replace(/[ÀÁÂÃÄ]/g,"A").replace(/[ÈÉÊË]/g,"E").replace(/[ÍÌÎÏ]/g,"I").replace(/[ÓÒÔÖÕ]/g,"O").replace(/[ÚÙÛÜ]/g,"U").replace(/[Ç]/g,"C")}-${year}.csv`, function (err) {
                        if (err) {
                            console.log(err)
                            return
                        }
                    })
                }
            }
        })
    })
})

代码使用 NodeJS:

  1. 列出目录内的文件;
  2. 将文件读取为 utf8(无需转换为 .txt,我可以将其用作 .1 .2 .3 等等)并查看它是否包含来自对象的键(纬度);
  3. 将其重命名为 Key 的值(如果它确实包含该 Key),同时将扩展名更改为 .csv

我知道这不是解决这个问题的最佳方法。如果文件太多/词典太大,它可能会很繁重。但对于我的需求来说,这已经足够了。

相关内容