gpt4 book ai didi

R - 导入一个奇怪的 CSV 文件

转载 作者:行者123 更新时间:2023-12-02 01:00:02 26 4
gpt4 key购买 nike

我搜索了 Stackoverflow 和网络,找到了一些类似的解决方案,我认为这是一个非常简单的问题,但没有解决这个问题。但是,也许我只是没有用正确的“R”术语来考虑它,所以这里是……请帮忙。

我有一些奇怪的 CSV 文件,我每天都必须处理这些文件。

这是输入数据的模型:

This is worthless and I want to get rid of it,,,,,,,,
This is worthless and I want to get rid of it,,,,,,,,
This line may or may not be here,,,,,,,,
This line may or may not be here,,,,,,,,
This line may or may not be here,,,,,,,,
Header1,Header2,Header3,Header4,Header5,Header6,Header12,Header13,
20345604,10.21.1151.12.0,Daisy,Petal,Stem,Data,Data,Data,
20345627,10.21.1151.12.0,Rose,Petal,Stem,Data,Data,Data,
20345600,10.21.1151.12.0,Samson,Petal,Stem,Data,Data,Data,
20345623,10.21.1151.12.0,Cloud,Petal,Stem,Data,Data,Data,
Header1,Header2,Header3,Header4,Header5,Header6,Header12,Header13,
20345704,10.21.1151.12.0,Simmons,Petal,Stem,Data,Data,Data,
20345677,10.21.1151.12.0,Butle,Petal,Stem,Data,Data,Data,
20347600,10.21.1151.12.0,Rose,Petal,Stem,Data,Data,Data,
20745623,10.21.1151.12.0,Unicorn,Petal,Stem,Data,Data,Data,

原始文件的注意事项:

  • 它们都是标准的csvs
  • 列数可能因文件或日期而异,但标题应始终以相同的初始列名开头(在本例中为“Header1”)。
  • 每个文件至少有 2-10 行毫无值(value),我不需要。
  • 实际标题将出现在前 10 行内
  • 第一个标题行之后的所有数据都是 Group1 的一部分,我想添加一个新列“Group”作为数据
  • 最终(5000 到 100,000 行之后),将出现另一组相同的标题行。第二个标题行之后的所有数据都是 Group2 的一部分,我想更改新组列中的数据以匹配(即更改为将“Group2”放入该列)。

最后我想结束这个(给定上面的初始数据):

Header1,Header2,Header3,Header4,Header5,Header6,Header12,Header13,NEWFIELD
20345604,10.21.1151.12.0,Daisy,Petal,Stem,Data,Data,Data,Group1
20345627,10.21.1151.12.0,Rose,Petal,Stem,Data,Data,Data,Group1
20345600,10.21.1151.12.0,Samson,Petal,Stem,Data,Data,Data,Group1
20345623,10.21.1151.12.0,Cloud,Petal,Stem,Data,Data,Data,Group1
20345704,10.21.1151.12.0,Simmons,Petal,Stem,Data,Data,Data,Group2
20345677,10.21.1151.12.0,Butle,Petal,Stem,Data,Data,Data,Group2
20347600,10.21.1151.12.0,Rose,Petal,Stem,Data,Data,Data,Group2
20745623,10.21.1151.12.0,Unicorn,Petal,Stem,Data,Data,Data,Group2

我曾尝试将数据视为具有一系列 if/else 语句的连接流,以执行标题、组、添加新列等的识别,但我在将其放回表单中时遇到问题我可以使用适当的 header 。

Group <- "Start"

processFile = function(datafilepath) {
con = file(datafilepath, "r")
while ( TRUE ) {
line = readLines(con, n = 1)
if ( length(line) == 0 ) {
print("EOF")
break
}

if (grepl("Header1", line) & Group == "Start") {
colnames(result) <- data.frame(paste(line,",","Group"))
print("Initial Headers found, Switching to Group1")
Group <- "Group1"
} else if (grepl("Systems.Name", line) & Group == "Group1") {
print("Switching to Group2")
Group <- "Group2"
} else if (Group == "Start") {print("At Start")}

if (Group != "Start") {
indresult <- (paste(line,",", Group))
result <- rbind(result, indresult)
}
}
return(result)
close(con)
}

此代码无法正确加载 header ,我找不到直接加载 header 然后加载数据的方法。我相当确定如果可以完成其他列添加应该工作但是我无法验证结果数据将被视为完整的数据帧直到我可以通过这个。

主要问题:这是解决此问题的正确方法吗?如果是这样,我如何将数据放入数据框中以便能够使用它?

谢谢,


我目前使用的解决方案:较早的 fread 解决方案是最接近的,但我费了好大劲才解决这个问题,我的设置无法识别 := 赋值运算符。因此,这是我最终使用的:

#This line removes all rows before the appears of "Header1"
Data <- fread(paste(Folder, File, sep = ""), skip="Header1")
Group= "Group1"

#Add additional column to data frame to be filled in below
Data$Group= ""

#Loop through each row and add Group - I had tried using simply "Data" instead of 1:nrow(Data) but in that case R only took the initial column of Data and not each row itself.
for (dataline in 1:nrow(Data)) {
if (Data[dataline,]$"Header1" == "Header1" & Group == "Group1") {
#Reached second row of Headers indicating Group change
Group <- "Group2"
next
}
#Assign Group
Data[dataline,]$Group <- Group

}
#Remove Duplicate Header rows
Data <- Data[!(Data$Header == "Header1"),]

它很慢(运行 50,000 行大约需要 4-5 分钟)但它至少是自动的并且可以满足我的需要。如果有加快速度的方法,请随时添加。谢谢!

最佳答案

像这样:

x = 'This is worthless and I want to get rid of it,,,,,,,,
This is worthless and I want to get rid of it,,,,,,,,
This line may or may not be here,,,,,,,,
This line may or may not be here,,,,,,,,
This line may or may not be here,,,,,,,,
Header1,Header2,Header3,Header4,Header5,Header6,Header12,Header13,
20345604,10.21.1151.12.0,Daisy,Petal,Stem,Data,Data,Data,
20345627,10.21.1151.12.0,Rose,Petal,Stem,Data,Data,Data,
20345600,10.21.1151.12.0,Samson,Petal,Stem,Data,Data,Data,
20345623,10.21.1151.12.0,Cloud,Petal,Stem,Data,Data,Data,
Header1,Header2,Header3,Header4,Header5,Header6,Header12,Header13,
20345704,10.21.1151.12.0,Simmons,Petal,Stem,Data,Data,Data,
20345677,10.21.1151.12.0,Butle,Petal,Stem,Data,Data,Data,
20347600,10.21.1151.12.0,Rose,Petal,Stem,Data,Data,Data,
20745623,10.21.1151.12.0,Unicorn,Petal,Stem,Data,Data,Data,'


require(data.table)
require(zoo) # for na.locf

o = fread(x, skip = 5,sep= ',')

# count how many headers
nh = nrow(o[grepl('Header1', V1) & grepl('Header2', V2)])

# add header id
o[grepl('Header1', V1) & grepl('Header2', V2), group := 1:nh]

# fill down header
o[, group := na.locf(group, na.rm = FALSE)]

# remove rows containing 'Header*'
o = o[!grepl('Header1', V1) & !grepl('Header2', V2) ]

o

V1 V2 V3 V4 V5 V6 V7 V8 V9 group
1: 20345604 10.21.1151.12.0 Daisy Petal Stem Data Data Data NA 1
2: 20345627 10.21.1151.12.0 Rose Petal Stem Data Data Data NA 1
3: 20345600 10.21.1151.12.0 Samson Petal Stem Data Data Data NA 1
4: 20345623 10.21.1151.12.0 Cloud Petal Stem Data Data Data NA 1
5: 20345704 10.21.1151.12.0 Simmons Petal Stem Data Data Data NA 2
6: 20345677 10.21.1151.12.0 Butle Petal Stem Data Data Data NA 2
7: 20347600 10.21.1151.12.0 Rose Petal Stem Data Data Data NA 2
8: 20745623 10.21.1151.12.0 Unicorn Petal Stem Data Data Data NA 2

x 应该是您的 csv 文件的路径。

另外,查看 data.table::fread 以获得更多可能在这里有用的参数。

您可以进一步使用 setnames() 来更改列名,并可能将数据类型从字符更改为数字,以防原始数据集包含它。

关于R - 导入一个奇怪的 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51288479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com