我必须阅读一个 CSV 文件,其中包含一些注释行(以 # 开头)以及数据行。fread函数用于读取此 CSV 文件。
config <- fread("Configuration.csv")
Run Code Online (Sandbox Code Playgroud)
在这个文件中的行数不是固定的,它们可能会被更改。如何在没有这些注释行的情况下阅读 CSV。
提前致谢!!!
我想用来fread仅拉入名称与条件匹配的列。(在本例中,我想提取包含标签 的所有列。)想象一下,您在工作目录中email调用的文件中有此数据:tempdata.txt
col1,col2,col3,email1,email2,col4,url1,url2,col5
1,2,3,4,5,6,7,8,9
9,8,7,6,5,4,3,2,1
x,x,x,me@me.com,you@you.com,y,y,y,y
a,a,a,a,a,a,http://google.com,http://stackoverflow.com,a
Run Code Online (Sandbox Code Playgroud)
如果您知道名称,则可以用于fread加载列的子集:
test <- data.table::fread("tempdata.txt", select=c("email1","email2"))
> test
email1 email2
1: 4 5
2: 6 5
3: me@me.com you@you.com
4: a a
Run Code Online (Sandbox Code Playgroud)
是否也可以使用字符串匹配进行选择?我试图模仿这种行为,但在fread命令内:
> all <- data.table::fread("tempdata.txt")
> all %>% select(contains("email"))
email1 email2
1: 4 5
2: 6 5
3: me@me.com you@you.com
4: a a
Run Code Online (Sandbox Code Playgroud)
感谢您的任何见解。
我的工作可以看作是一个 C 解释器,它检测它解释的程序中的所有未定义行为。在使用此解释器查找遗留开源 C 应用程序中的错误时,我对以下行为感到困惑:
遗留应用程序需要一个 10 字节的标头,它需要完整的标头才能做进一步的工作。它正确地调用了fread(buffer, 10, 1, f);. 错误的是,它没有分配fread调用的结果,并立即开始解析缓冲区。
当这fread应用于buffer可用数据少于 10 个字节的文件时,发生的情况是部分文件与可用数据一起归档。解释器,正如它设计的那样,检测到缓冲区的一个未初始化的部分后来被使用并警告了这一点,我能够将问题追溯到fread被丢弃的结果。
一分钟让我困惑的fread是,我同事写的部分填充了缓冲区,即使它0最终会返回,我想知道这是否可以改进。显然,一些实现确实读入缓冲区,最后将读取记录的数量返回为return n_bytes / __size;,让除法向下舍入,在这种情况下为0。但我想知道其他实现是否可能只buffer在整个记录可用时写入,否则完全未初始化。
实际上,在我手头的两个 Unices 上,fread其行为方式与我同事编写的模型实现方式相同:
~ $ cat t.c
#include <stdio.h>
#include <stdlib.h>
char buffer[11] = "0000000000";
int main(void) {
FILE *f = fopen("aaaa", "r");
if (!f) exit(1);
int r = fread(buffer, 10, 1, f);
printf("%s\n", buffer);
}
~ $ gcc …Run Code Online (Sandbox Code Playgroud) 如果对fread()的调用返回0并且ferror()指示错误(相对于EOF),是否可以重试读取或是否更好地关闭并重新打开文件?
我无法完全重新开始 - 输入文件已被部分处理,无法撤消(比如我一次写出一个块到套接字,并且由于现有协议,没有办法告诉远程端,"没关系,我需要重新开始").
我可以fclose()和fopen()文件,fseek()超过已经处理过的数据,并从那里继续fread() - 但这是必要的吗?
这是一大早,我只是没有得到这个:
以下代码有效,文件放在服务器上:
$filename = $ioid . "_" . time();
$fp = fopen("$filename.csv", "w+");
foreach ($csv as $fields) {
fputcsv($fp, $fields);
}
fclose($fp);
Run Code Online (Sandbox Code Playgroud)
但这不能直接使用(文件是105k):
$fp2 = fopen("$filename.csv", "r");
$output = fread($fp2, 1000000000000);
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=$filename.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo $output;
fclose($fp2);
Run Code Online (Sandbox Code Playgroud)
没有读取任何内容,也没有任何内容打印到页面上.
我做错了什么显而易见的事情?:)
在我的代码中,我有一种情况需要将数据从一个文件复制到另一个文件.我想出的解决方案如下:
const int BUF_SIZE = 1024;
char buf[BUF_SIZE];
int left_to_copy = toCopy;
while(left_to_copy > BUF_SIZE)
{
fread(buf, BUF_SIZE, 1, fin);
fwrite(buf, BUF_SIZE, 1, fout);
left_to_copy -= BUF_SIZE;
}
fread(buf, left_to_copy, 1, fin);
fwrite(buf, left_to_copy, 1, fout);
Run Code Online (Sandbox Code Playgroud)
我的主要想法是可能有类似memcpy的东西,但是对于文件中的数据.我只给它两个文件流和总字节数.我搜索了一下,但我找不到任何这样的东西.
但是如果没有这样的东西,我应该使用什么缓冲区大小来实现最快的传输?更大意味着更少的系统调用,但我认为它可能会破坏系统上的其他缓冲或缓存.我应该动态分配缓冲区,以便只进行一对读/写调用吗?在这种特定情况下,典型的传输大小是从几KB到十几MB.
编辑:对于操作系统特定信息,我们使用的是Linux.
EDIT2:
我尝试使用sendfile,但它没有用.它似乎写了适量的数据,但它是垃圾.
我用上面这样的东西替换了我的例子:
fflush(fin);
fflush(fout);
off_t offset = ftello64(fin);
sendfile(fileno(fout), fileno(fin), &offset, toCopy);
fseeko64(fin, offset, SEEK_SET);
Run Code Online (Sandbox Code Playgroud)
我添加了flush,offest,并且一次寻找一个,因为它似乎没有工作.
我有个问题:
我正在使用fread来读取文件.
typedef struct {
int ID1;
int ID2;
char string[256];
} Reg;
Reg *A = (Reg*) malloc(sizeof(Reg)*size);
size = FILESIZE/sizeof(Reg);
fread (A, sizeof(Reg), size, FILEREAD);
Run Code Online (Sandbox Code Playgroud)
使用循环,连续调用此调用,让我读取整个文件.
当我接近文件的末尾会发生什么,我无法读取"size"*sizeof(Reg),或者如果你只能读取这个数量的一半,那么我的数组A会发生什么.它会是完成?该函数将返回错误?
知道如何通过fread读取文件?
Edi1:确切地说,如果除法不精确的话,当我读到最后一点较小的文件大小时,我将读取未存档的内容,我想知道我的向量调整大小为我可以读取的字节数,或者发展更好的动态.
我看过类似的问题,但我的情况有点不同.我确保以二进制模式打开文件并检查读取时是否发生错误.
文件内容:
message1, message2, 53467
Run Code Online (Sandbox Code Playgroud)
程序读取简单文件:
int bytesRead;
FILE* CSV;
CSV = fopen("\\Temp\\csv.txt", "rb");
char dataBuf[128];
while ( (bytesRead = fread(dataBuf, 1, sizeof(dataBuf), CSV) > 0) )
{
if (ferror(CSV))
//handle error
//do stuff with dataBuf contents
}
Run Code Online (Sandbox Code Playgroud)
fread()总是返回1.还没有输入ferror,所以没有文件读取错误.但是,char数组dataBuf填充了文件中的整个消息.我正在使用fread与另一个函数一起使用,所以我需要知道使用fread()读取了多少字节.有任何想法吗?
我正在尝试检查何时fread()引发错误,因此我使用ferror()。
chunk = fread(buf, 1, 100, file);
if (ferror(file))
{
return errno;
}
Run Code Online (Sandbox Code Playgroud)
但是,ferror()手册页说:
错误这些函数应该不会失败,并且不要设置外部变量errno。
所以,我怎么能知道,当文件被读取时出现错误类型,但fread()并ferror()没有设置errno?
如果我有一个用gzip压缩的大型数据文件,比方说dat.gz,什么是更高效的内存?
mydat <- fread("gunzip -c dat.gz")
Run Code Online (Sandbox Code Playgroud)
或者,首先解压缩/解压缩文件dat,然后执行
mydat <- fread("dat")
Run Code Online (Sandbox Code Playgroud)
我关心记忆而不是速度,以防止R崩溃.