标签: fread

使用“fread”,如何从 csv 中删除注释行?

我必须阅读一个 CSV 文件,其中包含一些注释行(以 # 开头)以及数据行。fread函数用于读取此 CSV 文件。

config <- fread("Configuration.csv")
Run Code Online (Sandbox Code Playgroud)

CSV 文件快照

在这个文件中的行数不是固定的,它们可能会被更改。如何在没有这些注释行的情况下阅读 CSV。

提前致谢!!!

csv comments r fread

4
推荐指数
1
解决办法
1884
查看次数

R data.table fread select 与部分字符串匹配?

我想用来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)

感谢您的任何见解。

select r fread data.table

4
推荐指数
1
解决办法
1050
查看次数

在文件结束前只有部分记录可用时 fread 的行为

我的工作可以看作是一个 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)

c fread language-lawyer

4
推荐指数
1
解决办法
131
查看次数

从fread()失败中恢复的好方法是什么?

如果对fread()的调用返回0并且ferror()指示错误(相对于EOF),是否可以重试读取或是否更好地关闭并重新打开文件?

我无法完全重新开始 - 输入文件已被部分处理,无法撤消(比如我一次写出一个块到套接字,并且由于现有协议,没有办法告诉远程端,"没关系,我需要重新开始").

我可以fclose()和fopen()文件,fseek()超过已经处理过的数据,并从那里继续fread() - 但这是必要的吗?

c c++ error-handling recovery fread

3
推荐指数
2
解决办法
2316
查看次数

成功fopen,write和fclose后,PHP 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)

没有读取任何内容,也没有任何内容打印到页面上.

我做错了什么显而易见的事情?:)

php fopen fread

3
推荐指数
1
解决办法
2165
查看次数

在C/C++中将数据从一个文件复制到另一个文件的最快方法?

在我的代码中,我有一种情况需要将数据从一个文件复制到另一个文件.我想出的解决方案如下:

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,并且一次寻找一个,因为它似乎没有工作.

c c++ file-io fwrite fread

3
推荐指数
1
解决办法
7470
查看次数

使用fread功能:要读取的大小大于可读取的大小

我有个问题:

我正在使用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:确切地说,如果除法不精确的话,当我读到最后一点较小的文件大小时,我将读取未存档的内容,我想知道我的向量调整大小为我可以读取的字节数,或者发展更好的动态.

c fread file-pointer

3
推荐指数
1
解决办法
4653
查看次数

fread()的问题总是返回1

我看过类似的问题,但我的情况有点不同.我确保以二进制模式打开文件并检查读取时是否发生错误.

文件内容:

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()读取了多少字节.有任何想法吗?

c embedded file fread windows-ce

3
推荐指数
1
解决办法
1074
查看次数

恐惧和恐惧不要设置errno

我正在尝试检查何时fread()引发错误,因此我使用ferror()

chunk = fread(buf, 1, 100, file);
if (ferror(file))
  {
    return errno;
  }
Run Code Online (Sandbox Code Playgroud)

但是,ferror()手册页说:

错误这些函数应该不会失败,并且不要设置外部变量errno。

所以,我怎么能知道,当文件被读取时出现错误类型,但fread()ferror()没有设置errno

c errno fread ferror

3
推荐指数
1
解决办法
2745
查看次数

用gunzip畏惧:内存效率更高的方式是什么?

如果我有一个用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崩溃.

memory gzip r fread data.table

3
推荐指数
1
解决办法
1205
查看次数