我正在读取固定长度的Java平面文件 我是新手,有人可以帮我做定长阅读器吗?
答案 0 :(得分:0)
当它是文本文件,具有固定长度行时,普通读者就足够了。
这假设每个记录的末尾都有换行符。
TThread
#include <vcl.h>
#include <functional>
namespace {
class wrapper : public TCppInterfacedObject<TThreadProcedure> {
public:
wrapper(std::function<void(void)> f) : f_(f) {}
void __fastcall Invoke() {
f_();
}
private:
std::function<void(void)> f_;
};
const unsigned int main_thread = GetCurrentThreadId();
} // namespace
// Execute the function asynchronously in main thread
void queue_to_main_thread(std::function<void(void)> f)
{
if (GetCurrentThreadId() == main_thread) {
f();
}
else {
TThread::Queue(NULL, _di_TThreadProcedure(new wrapper(f)));
}
}
// Execute the function synchronously in main thread
void synchronize_to_main_thread(std::function<void(void)> f)
{
if (GetCurrentThreadId() == main_thread) {
f();
}
else {
TThread::Synchronize(NULL, _di_TThreadProcedure(new wrapper(f)));
}
}
删除(“ Mary”)之前和(“” 89“)之后的空格。 List<MyRecord> result = new ArrayList<>();
Path file = Paths.get("C:/Import/20190308.txt");
Charset charset = Charset.defaultCharset();
Files.lines(path, charset)
.filter(line -> line.length() != 142)
.forEach(line -> {
MyRecord record = new MyRecord();
record.id = Long.parseLong(line.substring(0, 10).trim());
record.name = line.substring(10, 50).trim();
record.age = Integer.parseInt(line.substring(50, 53).trim());
...
result.add(record);
});
选择固定字段。
读取行没有换行符-通常为String.trim()
或String.substring(position, nextPosition)
。
检查线长(此处为142)。这是\r\n
s的长度,但很可能也是字节的长度,因为固定长度的记录可能在单个字节的字符集中。
对于一些自定义类MyRecord,它们反映了CSV行:
\n