【问题标题】:how to copy consecutive and skip n- lines in csv?如何在csv中复制连续并跳过n行?
【发布时间】:2021-01-27 21:35:44
【问题描述】:

我每年都有 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 个连续行块的新文件,然后跳过一些行。 FI我想知道全年每 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 以及一些我无法满足我需要的面向对象的宏。 然后我认为它可能更适合 cmd 脚本,但我也找不到合适的示例。 我能够做的是列出我想要在 calc 中的行,并在以下帮助下: =间接(地址($L$1,K3,1,,"Sheet1")) 其中 l1=1 和 k3=3 它应该导致 sheet1.C1,并且为我解决了它

【问题讨论】:

  • 欢迎来到 Stackoverflow。如果您澄清一下,您可能会得到更好的答案:您希望如何实现这一目标。即在 Excel 中,或以编程方式(SO 是关于编程),使用哪种语言......?你到底想做什么 - 我不太明白要保留/跳过哪些行。你的问题是什么,到目前为止你尝试了什么,出了什么问题?例如。寻址R中的数据帧行?你能举一个例子吗 - 在你的 Q 中,你似乎只保留第 2、3、n1、n2 行(n1 和 n2 不是“整个”数据集的一部分)。
  • 这听起来像一个数据库应用程序。将 .csv 文件加载到数据库(任何数据库)并针对它编写 SQL。我不认为这是一个很好的 cmd.exe .bat 文件脚本应用程序。

标签: csv sorting cmd skip


【解决方案1】:

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

@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 秒。

【讨论】:

    【解决方案2】:

    我会使用 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 解决方案,您可以扩展您自己提供的链接,第一行和第二行可能各有两个偏移公式,但这可能更适合超级用户论坛。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      相关资源
      最近更新 更多