如果你必须设计一个文件处理组件/系统,它可以采用各种各样的文件格式(包括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等专有格式),解析/验证并将这些信息存储到数据库中......你会怎么做?
我们想要创建一个相对简单的文档存储,但有一些要求.我的想法是,文件在立即到达存储时由单独的工具/守护进程扫描和处理.
(伪)DMS应该通过NFS和Samba提供访问.正如我到目前为止看到的那样,管道可以将传入的文件传递给某些钩子.但我想知道是否有办法将目录创建为管道.我见过只有命名管道了.
应该在此目录中获取任何传入文件的进程是一个PHP脚本,它应该执行类似MIME类型猜测,CRC32检查(对数据库中的值)...有人提示如何执行此操作吗?
编辑:我希望通过以下解释更清楚一点 - 我正在寻找一种通过Samba和NFS提供"端点"的方法,其中可以放置由病毒扫描和元处理立即处理的文件(并最终存储) .
我有一个爬虫程序,它记录了一些文件.有时在服务器上,会发生一些错误,爬虫会创建大量的日志文件,这些文件在某种程度上无法解析.出于这个原因,我想创建一个简单的程序,它在日志文件的末尾读取大约1000个字符并向我显示消息(即使爬虫仍在写入该文件).这将帮助我在不关闭爬虫的情况下解决问题.
我正在处理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打算做的完全相反.那么使用我的数据库的更有效,惯用的方法是什么?
一个想法可能是使用多方法来处理依赖于head?谓词值的标题和数据,但我认为这会产生一些严重的速度影响,特别是因为只有一个出现,其中谓词结果从始终变为真总变为假.我还没有基准测试.
用另一种方法构建line-seq并用它解析它会更好iterate吗?这仍然需要我使用:while和:drop-while,我猜.
在我的研究中,曾多次提到使用NIO文件访问,这应该可以提高内存使用率.我还没知道如何在clojure中以惯用的方式使用它.
也许我仍然很难掌握一般的想法,如何处理文件? …
所以我从一个名为 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) 假设你有一个二进制文件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 发生了很多变化,所以我想知道现在是否有更好/更快的方法?
我们最近经历了从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) 我需要用Java阅读和处理一些大文件,我想知道,如果有一些明智的方法可以保护文件,当我正在阅读和处理它时,它不会被其他进程覆盖?
也就是说,某种方式使它成为只读,保持"开放"或某事......
这将在Windows环境中完成.
br,Touko
我正在尝试提高用 C# 和 .NET 2.0 开发的、处理大量文件的 Windows 服务的性能。我想每秒处理更多文件。
在其过程中,对于每个文件,该服务都会执行数据库查询以检索系统的某些参数。
这些参数每年都会变化,我认为如果将这些参数作为单例加载并定期刷新该单例,我会获得一些性能。我不会对每个正在处理的文件进行数据库查询,而是从内存中获取参数。
完成该场景:我使用 Windows Server 2008 R2 64 位,SQL Server 2008 是数据库,C# 和 .NET 2.0,如前所述。
我的方法正确吗?你会怎么办?
谢谢!
我正在尝试使用 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)