假设您有一个文本文件 - 确定该文件中文本行数的最快和/或最有效的内存方式是什么?
是否只是逐个字符地扫描它并寻找换行符?
对于日志处理,我的应用程序需要逐行读取文本文件.首先我使用了BufferedReader的readLine()函数,但我在网上读到BufferedReader在读取文件时速度很慢.
之后我尝试将FileInputStream与FileChannel和MappedByteBuffer一起使用,但在这种情况下,没有类似于readLine()的函数,所以我在文本中搜索换行符并处理它:
try {
FileInputStream f = new FileInputStream(file);
FileChannel ch = f.getChannel( );
MappedByteBuffer mb = ch.map(FileChannel.MapMode.READ_ONLY, 0L, ch.size());
byte[] bytes = new byte[1024];
int i = 0;
while (mb.hasRemaining()) {
byte get = mb.get();
if(get == '\n') {
if(ra.run(new String(bytes)))
cnt++;
for(int j = 0; j<=i; j++)
bytes[j] = 0;
i = 0;
}
else
bytes[i++] = get;
}
} catch(Exception ex) {
ex.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
我知道这可能不是实现它的好方法,但是当我以字节为单位读取文本文件时,它比使用BufferedReader快3倍,但是调用new String(bytes)会创建一个新的String并使程序在使用BufferedReader时更慢.
所以我想问一下逐行读取文本文件的最快方法是什么?有人说BufferedReader是解决这个问题的唯一方法.
PS:ra是dk.brics.Automaton库中RunAutomaton的一个实例.
在Python 2.5中,我正在使用文件指针读取结构化文本数据文件(大小约为30 MB):
fp = open('myfile.txt', 'r')
line = fp.readline()
# ... many other fp.readline() processing steps, which
# are used in different contexts to read the structures
Run Code Online (Sandbox Code Playgroud)
但是,在解析文件时,我点击了一些有趣的东西,我想报告行号,所以我可以在文本编辑器中调查该文件.我可以fp.tell()用来告诉我字节偏移量在哪里(例如16548974L),但没有"fp.tell_line_number()"来帮助我将其转换为行号.
是否有Python内置或扩展可以轻松跟踪并"告诉"文本文件指针所在的行号?
注意:我不是要求使用line_number += 1样式计数器,因为我fp.readline()在不同的上下文中调用,并且该方法需要更多的调试,而不是将计数器插入代码的右角.
我必须在VB6中编写一个文本文件.我需要附加和utf-8编码.
我尝试了两个解决方案,一个使用"TextStream",另一个使用"ADODB.Stream".
第一个:
Set fsoFile = fso.OpenTextFile(FileIn(fi), ForAppending, True)
fsoFile.WriteLine "<tag>kkkjòòkkkkjlòlk</tag>"
fsoFile.Close
Run Code Online (Sandbox Code Playgroud)
附加效果不错,但我如何编写utf-8编码?
第二个:
Dim ST As ADODB.Stream
Set ST = New ADODB.Stream
ST.Mode = adModeReadWrite
ST.Type = adTypeText
ST.Charset = "UTF-8"
ST.Open
ST.LoadFromFile FileIn(fi)
ST.Position = ST.Size
ST.WriteText "<tag>kkkjòòkkkkjlòlk</tag>"
ST.SaveToFile FileIn(fi)
ST.Close
Run Code Online (Sandbox Code Playgroud)
在utf-8中正确写入,但我不能附加写入文件,但只能使用"adSaveCreateOverWrite".
我怎样才能做到这一点?还有另外一种方法吗?
非常感谢你.
以下是我一直在使用的内容.虽然它确实有效,但我的程序在尝试计算一个相当大的文件时会锁定,例如10,000行或更多行.较小的文件立即运行.
是否有更好的或者我应该说更快的方式来计算文本文件中的行?
这是我目前正在使用的:
Dim selectedItems = (From i In ListBox1.SelectedItems).ToArray()
For Each selectedItem In selectedItems
ListBox2.Items.Add(selectedItem)
ListBox1.Items.Remove(selectedItem)
Dim FileQty = selectedItem.ToString
'reads the data file and returns the qty
Dim intLines As Integer = 0
'Dim sr As New IO.StreamReader(OpenFileDialog1.FileName)
Dim sr As New IO.StreamReader(TextBox1_Path.Text + "\" + FileQty)
Do While sr.Peek() >= 0
TextBox1.Text += sr.ReadLine() & ControlChars.CrLf
intLines += 1
Loop
ListBox6.Items.Add(intLines)
Next
Run Code Online (Sandbox Code Playgroud) 我试图在一个非常大的文本文件30Mb +中替换600个不同的字符串.我现在正在构建一个执行此操作的脚本; 以下问题:
脚本:
$string = gc $filePath
$string | % {
$_ -replace 'something0','somethingelse0' `
-replace 'something1','somethingelse1' `
-replace 'something2','somethingelse2' `
-replace 'something3','somethingelse3' `
-replace 'something4','somethingelse4' `
-replace 'something5','somethingelse5' `
...
(600 More Lines...)
...
}
$string | ac "C:\log.txt"
Run Code Online (Sandbox Code Playgroud)
但是,由于这将检查每行600次,并且文本文件中有超过150,000多行,这意味着需要大量的处理时间.
有没有比这更有效的更好的替代方案?
干杯,对此有任何建议.
在C++中,我想读取一个带有浮点列的文本文件,并将它们放在一个二维数组中.
第一行将是第一列,依此类推.
数组的大小未知,它取决于可能变化的行和列.
我试过"getline","inFile >>",但我所做的所有更改都有一些问题.
例如,有没有办法在值存在后删除不必要的行/行?
文件看起来像这样(+/-):
谢谢
直到现在我有这个:
int ReadFromFile(){
ifstream inFile;
ofstream outFile;
int nLinActual = 0;
const int nCol = 9;
const int nLin = 10;
// open file for reading
inFile.open("values.txt");
// checks if file opened
if(inFile.fail()) {
cout << "error loading .txt file reading" << endl;
return 1;
}
// open file for writing
outFile.open ("outArray.txt");
// checks if file …Run Code Online (Sandbox Code Playgroud) 我有一个5000多行的文件.我想找到每次运行程序时选择其中一行的最有效方法.我原本打算用随机方法选择一个(之前我知道有5000行).认为可能效率低下,所以我想我会看第一行,然后从顶部删除它并将其附加到底部.但似乎我必须读取整个文件并创建一个要从顶部删除的新文件.
什么是最有效的方法:随机方法或新文件方法?
该程序将每5分钟运行一次,我使用的是c#4.5
我在尝试在C#中的文本文件中查找单词时遇到问题.
我想找到输入到控制台则显示,这个词被发现在整个行字在控制台.
在我的文本文件中,我有:
斯蒂芬哈伦,12月,9,4055551235
Laura Clausing,January,23,4054447788
威廉康纳,12月,13,123456789
卡拉玛丽,十月,23,1593574862
Audrey Carrit,1月16,1684527548
塞巴斯蒂安贝克,十月,23,9184569876
因此,如果我输入"12月",我希望它显示"Stephen Haren,12月,9,4055551235"和"William Connor,12月,13,123456789".
我想过使用子串,但我认为必须有一个更简单的方法.
给出答案后我的代码:
using System;
using System.IO;
class ReadFriendRecords
{
public static void Main()
{
//the path of the file
FileStream inFile = new FileStream(@"H:\C#\Chapter.14\FriendInfo.txt", FileMode.Open, FileAccess.Read);
StreamReader reader = new StreamReader(inFile);
string record;
string input;
Console.Write("Enter Friend's Birth Month >> ");
input = Console.ReadLine();
try
{
//the program reads the record and displays it on the screen
record = reader.ReadLine();
while (record != null) …Run Code Online (Sandbox Code Playgroud) 当我尝试将包含多行的字符串写入输出文本文件时,不会保留换行符,并且所有内容都打印在一行中.
具体来说,我有一个按钮,点击一个监听器并关联此功能:
function (e) {
this.downloadButton.setAttribute("download", "output.txt");
var textToSend = string1+"\r\n"+string2+"\r\n"+string3;
this.downloadButton.setAttribute('href', 'data:text/plain;charset=utf-8,' + textToSend);
}
Run Code Online (Sandbox Code Playgroud)
文件正确下载,但string1,string2和string3在同一行.
有什么建议吗?
text-files ×10
c# ×3
.net ×1
append ×1
arrays ×1
c++ ×1
file-io ×1
java ×1
javascript ×1
line-numbers ×1
newline ×1
perl ×1
powershell ×1
python ×1
readline ×1
regex ×1
replace ×1
root ×1
streamreader ×1
string ×1
text ×1
utf-8 ×1
vb.net ×1
vb6 ×1
windows ×1