标签: file-processing

设计处理许多文件格式,解析,验证和持久性的文件处理

如果你必须设计一个文件处理组件/系统,它可以采用各种各样的文件格式(包括Excel等专有格式),解析/验证并将这些信息存储到数据库中......你会怎么做?

注意:95%的时间1行输入数据将等于数据库中的一条记录,但并非总是如此.

目前我正在使用一些我设计的自定义软件来解析/验证/存储客户数据到我们的数据库.系统按文件系统中的位置(从ftp drop)标识文件,然后加载XML"定义"文件.(根据输入文件的删除位置加载正确的XML).

XML指定文件布局(分隔或固定宽度)和字段特定项(长度,数据类型(数字,字母,字母数字)以及要将字段存储到的DB列).

         <delimiter><![CDATA[ ]]></delimiter>
   <numberOfItems>12</numberOfItems>
   <dataItems>
    <item>
     <name>Member ID</name>
     <type>any</type>
     <minLength>0</minLength>
     <maxLength>0</maxLength>
     <validate>false</validate>
     <customValidation/>
     <dbColumn>MembershipID</dbColumn>
    </item>
Run Code Online (Sandbox Code Playgroud)

由于这种设计,输入文件必须是文本(固定宽度或分隔),并且从输入文件数据字段到DB列具有1对1的关系.

我想扩展我们的文件处理系统的功能,以采用Excel或其他文件格式.

我至少有六种方法可以继续,但我现在卡住了,因为我没有任何人可以真正反省这些想法.

再说一遍:如果你必须设计一个文件处理组件,它可以采用各种各样的文件格式(包括Excel等专有格式),解析/验证并将这些信息存储到数据库中......你会怎么做?

system file-processing

5
推荐指数
1
解决办法
407
查看次数

如何在Linux下创建一个像管道一样的目录

我们想要创建一个相对简单的文档存储,但有一些要求.我的想法是,文件在立即到达存储时由单独的工具/守护进程扫描和处理.

(伪)DMS应该通过NFS和Samba提供访问.正如我到目前为止看到的那样,管道可以将传入的文件传递给某些钩子.但我想知道是否有办法将目录创建为管道.我见过只有命名管道了.

应该在此目录中获取任何传入文件的进程是一个PHP脚本,它应该执行类似MIME类型猜测,CRC32检查(对数据库中的值)...有人提示如何执行此操作吗?

编辑:我希望通过以下解释更清楚一点 - 我正在寻找一种通过Samba和NFS提供"端点"的方法,其中可以放置由病毒扫描和元处理立即处理的文件(并最终存储) .

samba nfs pipe file-handling file-processing

5
推荐指数
1
解决办法
1104
查看次数

使用Java读取文件的最后n个字节

我有一个爬虫程序,它记录了一些文件.有时在服务器上,会发生一些错误,爬虫会创建大量的日志文件,这些文件在某种程度上无法解析.出于这个原因,我想创建一个简单的程序,它在日志文件的末尾读取大约1000个字符并向我显示消息(即使爬虫仍在写入该文件).这将帮助我在不关闭爬虫的情况下解决问题.

java windows file-processing

5
推荐指数
1
解决办法
4603
查看次数

Clojure - 处理内存不足的大文件

我正在处理60GB或更大的文本文件.这些文件分成可变长度的标题部分和数据部分.我有三个功能:

  • head? 用于区分标题行和数据行的谓词
  • process-header 处理一个标题行字符串
  • process-data 处理一个数据行字符串
  • 处理功能异步访问和修改内存数据库

我从另一个SO线程推进了文件读取方法,它应该构建一个懒惰的行序列.想法是用一个函数处理一些行,然后切换一次函数并继续处理下一个函数.

(defn lazy-file
  [file-name]
  (letfn [(helper [rdr]
            (lazy-seq
             (if-let [line (.readLine rdr)]
               (cons line (helper rdr))
               (do (.close rdr) nil))))]
    (try
      (helper (clojure.java.io/reader file-name))
      (catch Exception e
        (println "Exception while trying to open file" file-name)))))
Run Code Online (Sandbox Code Playgroud)

我喜欢用它

(let [lfile (lazy-file "my-file.txt")]
  (doseq [line lfile :while head?]
    (process-header line))
  (doseq [line (drop-while head? lfile)]
    (process-data line)))
Run Code Online (Sandbox Code Playgroud)

虽然这样可行,但由于以下几个原因,效率相当低:

  • 我不得不直接调用,process-head直到我到达数据然后继续process-data,我必须过滤标题行并处理它们,然后重新解析整个文件并删除所有标题行以处理数据.这与lazy-file打算做的完全相反.
  • 看着内存消耗告诉我,程序虽然看起来很懒,却会使用尽可能多的RAM来保存文件在内存中.

那么使用我的数据库的更有效,惯用的方法是什么?

一个想法可能是使用多方法来处理依赖于head?谓词值的标题和数据,但我认为这会产生一些严重的速度影响,特别是因为只有一个出现,其中谓词结果从始终变为真总变为假.我还没有基准测试.

用另一种方法构建line-seq并用它解析它会更好iterate吗?这仍然需要我使用:while和:drop-while,我猜.

在我的研究中,曾多次提到使用NIO文件访问,这应该可以提高内存使用率.我还没知道如何在clojure中以惯用的方式使用它.

也许我仍然很难掌握一般的想法,如何处理文件? …

clojure file-processing memory-efficient

5
推荐指数
1
解决办法
519
查看次数

如何以制表符分隔的方式写入文件?

所以我从一个名为 input.bed 的床文件中获得了这个数据框:

     V1       V2       V3  V4
 1 chr1 11323785 11617177 TF1
 2 chr1 12645605 13926923 TF2
 3 chr1 14750216 15119039 TF3
 4 chr1 18102157 19080189 TF1
 5 chr1 29491029 30934636 TF2
 6 chr1 33716472 35395979 TF4
 7 chr1 36712462 37685238 TF5
 8 chr1 37838094 38031209 TF3
Run Code Online (Sandbox Code Playgroud)

这是我从 .bed 文件中读取的数据框(.bed 文件是制表符分隔的)。我想获取每一行并将其输出到不同的文件。说 row1 我希望它在 input1.bed 中,第 2 行在 input2.bed

这是我的尝试:

 for(i in 1:nrow(input.bed))
  {
    file.create(paste("input",i,".bed",sep=""));

   }

 for(i in 1:nrow(input.bed))
 {
    write.table(unlist(input.bed[i,]),paste("input",i,".bed",sep=""),sep="\t");

}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我的文件的输出,这是来自 input1.bed,是:

    "V1"    "chr1"
    "V2"    "11323785"
    "V3"    "11617177"
    "V4" …
Run Code Online (Sandbox Code Playgroud)

r file file-processing

5
推荐指数
1
解决办法
7108
查看次数

在 Rust 中读取以 f64 为单位的二进制文件

假设你有一个二进制文件example.bin,并且你想以 为单位读取该文件f64,即前 8 个字节给出一个浮点数,接下来的 8 个字节给出一个数字等。(假设你知道字节序)这在 Rust 中如何完成?

我知道可以用来std::fs::read("example.bin")获取 aVec<u8>数据,但是你必须做很多“体操”才能将 8 个字节始终转换为 a f64,即

fn eight_bytes_to_array(barry: &[u8]) -> &[u8; 8] {
    barry.try_into().expect("slice with incorrect length")
}

let mut file_content = std::fs::read("example.bin").expect("Could not read file!");
let nr = eight_bytes_to_array(&file_content[0..8]);
let nr = f64::from_be_bytes(*nr_dp_per_spectrum);
Run Code Online (Sandbox Code Playgroud)

我看到了这篇文章,但它是从 2015 年开始的,从那时起 Rust 发生了很多变化,所以我想知道现在是否有更好/更快的方法?

file-processing rust

5
推荐指数
1
解决办法
3832
查看次数

ColdFusion 2023 FileRead 抛出 500 错误

我们最近经历了从CF11升级到CF2023的过程。在我们的开发服务器上,一切似乎都按预期进行。然而,在我们的生产服务器上安装后,我们发现了一个奇怪的问题。

cfc 文件中的命令fileRead似乎读取该文件,但在 cfc 处理完成后会抛出 500 错误。任何其他 cfc 中的任何其他命令(我们尚未发现)都不会出现此问题。我可以在我们的生产服务器上重现这个问题;但在开发(或测试)中使用相同的测试页面,代码可以正常工作。

我们直接的解决方法是使用cffile action="read". 这在开发生产中似乎工作得很好。

在开发中工作但在生产中不起作用的示例测试代码(读取文件,根据代码转储内容,但随后 500 错误覆盖在文件转储上) - fileReadTest.cfc:

component {

    struct function getRules() {

        try {

        var _rules = fileRead('[path]/configuration.json');
            _rules = deserializeJSON(_rules);

        return _rules;

        } catch( any e) {
            cfdump( var = e);
        }
    }

    remote string function test() {
        try {

            var _r = getRules()
            cfdump(var = _r);

            return 'test'

         } catch( any e) {
            cfdump( var = e);
        }
    }

} …
Run Code Online (Sandbox Code Playgroud)

coldfusion file-processing cfml

5
推荐指数
1
解决办法
231
查看次数

如何在使用Java读取和处理文件时防止文件被覆盖?

我需要用Java阅读和处理一些大文件,我想知道,如果有一些明智的方法可以保护文件,当我正在阅读和处理它时,它不会被其他进程覆盖?

也就是说,某种方式使它成为只读,保持"开放"或某事......

这将在Windows环境中完成.

br,Touko

java file-io filelock file-processing

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

从数据库查询还是从内存查询?哪个更快?

我正在尝试提高用 C# 和 .NET 2.0 开发的、处理大量文件的 Windows 服务的性能。我想每秒处理更多文件。

在其过程中,对于每个文件,该服务都会执行数据库查询以检索系统的某些参数。

这些参数每年都会变化,我认为如果将这些参数作为单例加载并定期刷新该单例,我会获得一些性能。我不会对每个正在处理的文件进行数据库查询,而是从内存中获取参数。

完成该场景:我使用 Windows Server 2008 R2 64 位,SQL Server 2008 是数据库,C# 和 .NET 2.0,如前所述。

我的方法正确吗?你会怎么办?

谢谢!

c# performance singleton windows-services file-processing

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

使用 Nestjs 和 Papa Parse 处理 CSV 文件

我正在尝试使用 Multer 和 Papa Parse 在 NestJS 中处理 CSV 文件。我不想将文件存储在本地。我只想解析 CSV 文件以提取一些信息。

但是,我无法处理它,我尝试了两种不同的方法。在第一个中,我将文件缓冲区传递给 Papa.parse 函数。但是,我收到错误: ReferenceError:FileReaderSync 未定义

@Post('1')
@UseInterceptors(
    FileInterceptor('file', {})
)
async uploadFile(@UploadedFile() file: Express.Multer.File ){
    const csvData = papa.parse(file.buffer, {
        header: false,
        worker: true,
        delimiter: ",",
        step: function (row){
            console.log("Row: ", row.data);
        }
      });
}
Run Code Online (Sandbox Code Playgroud)

因此尝试调用 readFileSync() 如下所示,但是这次我收到错误,ERROR [ExceptionsHandler] ENAMETOOLONG: name too long, open

@Post('2')
@UseInterceptors(
    FileInterceptor('file', {})
)
async uploadFile(@UploadedFile() file: Express.Multer.File ){
    const $file =   readFileSync(file.buffer);
    const csvData = papa.parse($file, {
        header: false,
        worker: true, …
Run Code Online (Sandbox Code Playgroud)

csv file-upload file-processing papaparse nestjs

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