python - 如何用新的时间戳重写文件中的某些行
问题描述
我有一个使用应用程序的多个不同 API 版本的文件在 API 的 V1 中,字符串中的开始和结束时间戳始终与模式匹配
&startTimestamp=1572580801000&endTimestamp=1572667141000`
所以一个完整的 url 可能看起来像这样(为安全起见省略了一些数据)
curl -k -X GET "https://serverpathandurl/api/v1/path?query=SELECT%%20xxx%%2C%%20%%20count(xxx)%%20FROM%%20xxx%%20group%%20by%%20xxx&startTimestamp=1572580801000&endTimestamp=1572667141000&explain=false" -H "header " -H "header" > File
我在这个文件中有一些没有时间戳的行。我每天在同一时间运行这个 CURL 语句文件。所以我知道它总是可以为开始和结束时间戳增加一个固定值 86400000
如何遍历文件,修改具有新递增值的开始和结束时间戳的行,并使用相同的名称写入文件?我假设部分问题是更改字符串值并将其添加为整数,然后重新调整字符串。
这是一个包含 3 个条目的文件内容示例
curl -k -X GET "https://serverpathandurl/api/v1/path?query=SELECT%%20xxx%%2C%%20%%20count(xxx)%%20FROM%%20xxx%%20group%%20by%%20xxx&startTimestamp=1572580801000&endTimestamp=1572667141000&explain=false" -H "header " -H "header" > File
curl -k -X GET "https://example2/api/v1/path?query=SELECT%%20xxx%%2C%%20%%20count(xxx)%%20FROM%%20xxx%%20group%%20by%%20xxx&startTimestamp=1572580801000&endTimestamp=1572667141000&explain=false" -H "header " -H "header" > File
curl -k -X GET "https://serverpathandurl/api/v2/metrics/series/xxx?resolution=INF&from=now-1d%%2Fm&scope=entity(xxx)" -H "headerionfo" -H "headerinfo" > file
解决方案
此答案适用于 PowerShell。
url 中的时间戳是 Unix 毫秒。
要通过每天添加一天 (86400000) 来替换时间戳,您可以执行以下操作:
$file = 'D:\urls.txt' # your file goes here
$lines = Get-Content -Path $file
for ($i = 0; $i -lt $lines.Count; $i++) {
if ($lines[$i] -match 'startTimestamp=(\d+)') {
$newTimeStamp = 'startTimestamp={0}' -f ([int64]$matches[1] + 86400000)
$lines[$i] = $lines[$i] -replace $matches[0], $newTimeStamp
}
if ($lines[$i] -match 'endTimestamp=(\d+)') {
$newTimeStamp = 'endTimestamp={0}' -f ([int64]$matches[1] + 86400000)
$lines[$i] = $lines[$i] -replace $matches[0], $newTimeStamp
}
}
$lines | Set-Content -Path $file -Force
如果您希望能够设置自己的开始和结束时间戳,可以使用以下转换方法:
要将 Unix MilliSecond 时间戳转换为 datetime 对象:
$utcDate = [DateTimeOffset]::FromUnixTimeMilliseconds(1572667141000).UtcDateTime # gives you the date in UTC
或者
$date = [DateTimeOffset]::FromUnixTimeMilliseconds(1572667141000).LocalDateTime # gives you the date in Local time
要将 DateTime 对象转换为 Unix 毫秒时间戳:
# example uses the current date
[DateTime]$origin = [DateTime]::new(1970, 1, 1, 0, 0, 0, 0, 'Utc')
[TimeSpan]$diff = (Get-Date).ToUniversalTime() - $origin
$unixTimeStamp = [int64][Math]::Floor($diff.TotalMilliseconds) # in MilliSeconds
在您的示例中,startTimestamp
转换为2019-11-01 04:00:01
和endTimestamp
转换为2019-11-02 03:59:01
(Utc)
startTimestamp 和 endTimestamp 之间的差异是 86340000 毫秒(1 天减去 1 分钟)
推荐阅读
- python - 如何只读取包含名称 i 的第一列的行
- node.js - 为什么 VueJS 不运行生产构建?
- amazon-web-services - 如何按计划分离和附加 EBS 卷
- r - 通过考虑 r 中的舍入将毫秒转换为 hh:mm 格式
- bash - Jenkins 运行失败的测试 n 次
- r - R:如何绘制找到根的使用函数
- ios - 更改我的 Mac 的用户名和主文件夹名称后,将应用程序上传到 Apple Connect 失败
- kubernetes - Argo WorkflowTemplate 自由格式输入参数
- python - 如何将 1970 年之前的日期格式字符串转换为 windows 中的时间戳
- excel - 复制和粘贴值