您可以跳过下面的内容,它是为我正在尝试做的事情提供一些背景的序言:
我有很多文件,它们是不同城市的 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:
- 列出目录内的文件;
- 将文件读取为 utf8(无需转换为 .txt,我可以将其用作 .1 .2 .3 等等)并查看它是否包含来自对象的键(纬度);
- 将其重命名为 Key 的值(如果它确实包含该 Key),同时将扩展名更改为 .csv
我知道这不是解决这个问题的最佳方法。如果文件太多/词典太大,它可能会很繁重。但对于我的需求来说,这已经足够了。