我有一个包含需要清理的txt文件的gzip文件.我想逐行读取GZipped文件,然后将清理后的内容一次性写入输出GZIP文件,如下所示:
void ExtractAndFix(string inputPath, string outputPath) {
StringBuilder sbLine = new StringBuilder();
using (GZipStream gzInput = new GZipStream(new FileStream(inputPath, FileMode.Open), System.IO.Compression.CompressionMode.Decompress)) {
using (StreamReader reader = new StreamReader(gzInput, Encoding.UTF8)) {
using (GZipOutputStream gzipWriter = new GZipOutputStream(new FileStream(outputPath, FileMode.Create))) {
string line = null;
while ((line = reader.ReadLine()) != null) {
sbLine.Clear();
sbLine.Append(line.Replace("\t", " "));
sbLine.Append("\r\n");
byte[] bytes = Encoding.UTF8.GetBytes(sbLine.ToString());
gzipWriter.Write(bytes, 0, bytes.Length);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,在while循环中调用line = reader.ReadLine()只读取一次然后返回null(reader EOS = true).我已经尝试使用本机C#压缩库和ICSharpCode包,我得到了相同的行为.我意识到我总是可以提取完整的文件,然后清理它,然后重新压缩它,但我不想浪费资源,硬盘空间等.注意:这些是大文件(压缩到几GB)所以任何事情使用MemoryStream不是一个好的解决方案.以前有没有人遇到过这样奇怪的事?谢谢.
我正在使用 StackExchange.Redis 包作为多线程应用程序的共享存储,该应用程序将同时在多个服务器上运行......所以多多线程;)
我拥有的最简单的用例之一是我想对一系列键(即 KEY1=4 KEY2=7、KEY3=13 等)进行基本计数。我将制定业务规则来强制执行给定键允许的最大允许值。因此,例如,假设 KEY1 最多只能达到 5……如果两个线程在试图增加它的同时触发,我只想让其中一个成功。
我相信我可以通过首先获取当前值然后使其成为该值未更改的条件来通过事务来完成此操作。这会像我期望的那样工作吗?有没有更优雅的方法来做到这一点?
public void Increment(string key) {
IDatabase db = redisConn.GetDatabase();
var val = db.StringGet(key);
int maxVal = 5;
if (Convert.ToInt32(val) < maxVal) {
var trans = db.CreateTransaction();
trans.AddCondition(Condition.StringEqual(key, val));
trans.StringIncrementAsync(key);
trans.Execute();
}
}
Run Code Online (Sandbox Code Playgroud)
PS:喜欢这个包,很高兴与它合作
我有一种情况,我在运行时反思一组属性。当我得到实际的属性值时,它只是对象类型,但我进行了检查以确认它是一个通用列表。在我的场景中,这些通用列表将始终包含某种原始值(整数、字符串、长整数等)。有没有一种简单的方法可以将任何类型的 List 转换为字符串列表?像这样:
object obj = pi.GetValue(item, null);
Type type = obj.GetType();
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>)) {
List<string> lstStrings = ???;
}
Run Code Online (Sandbox Code Playgroud)
或者我是否必须有一个很大的 switch 语句并首先转换为适当的运行时 List 类型,然后将其转换为 List?
谢谢