如何在 csv 中连续复制并跳过 n 行?

how to copy consecutive and skip n- lines in csv?

我每年都有 csv 文件,f.i。小时数据-2019.csv, 它看起来像这样:

date,hour,temp
20181231,24,75
20190101,1,76
20190101,2,76
20190101,3,75
20190101,4,76
20190101,5,74
......etc

我想做的是创建一个包含 2 行连续块的新文件,然后跳过一些行。 F.I。我想知道全年每 9 小时一个小时的温差,所以如果我跳过 7 行,新文件应该类似于:

20190101,1,76
20190101,2,76
20190101,10,57
20190101,11,60
20190101,19,61
20190101,20,56
.........etc

一开始我希望可以使用 OpenOffice 或 LibreOffice calc 模块,但只能找到类似的解决方案 Copy every nth line from one sheet to another 以及一些我无法满足我需要的 OO 宏。 然后我认为它可能更适合 cmd 脚本,但我也找不到合适的例子。 我能够做的是在 calc 中列出我想要的行,并借助于: =间接(地址($L$1,K3,1,"Sheet1")) 其中 l1=1 和 k3=3 它应该导致 sheet1.C1,这为我解决了它

我会用 R:

setwd(dir = "c:/...")                       # set working directory.
d <- read.csv("hourdata-2019.csv")          # read your datafile
rows <- c(2, 3, ...)                        # define the rows as needed, can be a formula
d[rows, ]                                   # will give you the modified dataset
write.csv(x = d, file = "hourdata-2019 out.csv")

如果您更喜欢 Libre/Excel 解决方案,您可以扩展自己提供的 link,可能第一行和第二行各有两个偏移公式,但这可能更适合超级用户论坛。

否则我确定 Linux/bash/sed 有类似向导的解决方案...,不确定 Win cmd。

不错的挑战。这是一个纯批处理解决方案:

@echo off
setlocal enabledelayedexpansion

REM following code to produce some data for testing:
(
echo date,hour,temp
echo 20181231,24,99
for /l %%a in (1,1,9) do @for /l %%b in (1,1,24) do @echo 2019010%%a,%%b,!random:~-2!
for /l %%a in (1,1,9) do @for /l %%b in (1,1,24) do @echo 2019011%%a,%%b,!random:~-2!
for /l %%a in (1,1,9) do @for /l %%b in (1,1,24) do @echo 2019012%%a,%%b,!random:~-2!
)>hourdata-test.csv


REM code to extract desired values
REM expected hour-pairs: 1,2 - 10,11 - 19,20 - 4,5 - 13,14 - 22,23 - 7,8 - 16,17 : repeat

(for /f "tokens=1,* delims=:" %%a in ('findstr /n "^" hourdata-test.csv') do (
  set /a "x=%%a %% 9"
  if !x! == 3 echo %%b
  if !x! == 4 echo %%b
))>ninerdata.csv

诀窍是使用行号,计算 Modulo 9 然后简单地比较结果值。跳过前两行是通过打印模数 3 和 4 来实现的。

一整年的数据应该不到 2 秒。