我正在查看我的分隔文件(例如CSV,tab分离等)解析选项,一般基于MS堆栈,特别是.net.我排除的唯一技术是SSIS,因为我已经知道它不能满足我的需求.
所以我的选择似乎是:
我有两个必须符合的标准.首先,给定以下文件,其中包含两个逻辑数据行(以及共五个物理行):
101, Bob, "Keeps his house ""clean"".
Needs to work on laundry."
102, Amy, "Brilliant.
Driven.
Diligent."
解析后的结果必须产生两个逻辑"行",每行包含三个字符串(或列).第三行/列字符串必须保留换行符!换句话说,由于"未闭合"文本限定符,解析器必须识别行何时"继续"到下一个物理行上.
第二个标准是每个文件的分隔符和文本限定符必须是可配置的.以下是两个字符串,取自不同的文件,我必须能够解析:
var first = @"""This"",""Is,A,Record"",""That """"Cannot"""", they say,"","""",,""be"",rightly,""parsed"",at all";
var second = @"~This~|~Is|A|Record~|~ThatCannot~|~be~|~parsed~|at all";
Run Code Online (Sandbox Code Playgroud)
正确解析字符串"first"将是:
'_'仅表示捕获了空白 - 我不希望出现文字下划线.
可以对要解析的平面文件做出一个重要的假设:每个文件将有固定数量的列.
现在深入了解技术方案.
正则表达式
首先,许多响应者评论说正则表达式"不是实现目标的最佳方式".但是,我确实找到了一位提供优秀CSV正则表达式的评论者:
var regex = @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))";
var Regex.Split(first, regex).Dump();
Run Code Online (Sandbox Code Playgroud)
应用于字符串"first"的结果非常精彩:
如果清除报价会很好,但我可以轻松地将其作为后处理步骤来处理.否则,此方法可用于解析样本字符串"first"和"second",前提是相应地修改了正则表达式和管道符号.优秀!
但真正的问题与多线标准有关.在将正则表达式应用于字符串之前,我必须从文件中读取完整的逻辑"行".不幸的是,我不知道要读取多少物理行来完成逻辑行,除非我有一个正则表达式/状态机.
所以这成了"鸡与鸡蛋"的问题.我最好的选择是将整个文件作为一个巨大的字符串读入内存,让正则表达式排序多行(我没有检查上面的正则表达式是否可以处理).如果我有一个10 gig文件,这可能有点不稳定. …
我正在阅读Osherove的"单元测试艺术",虽然我还没有看到他对性能测试有任何说法,但我还是想到了两个想法:
特别是出于上述第一个原因,我怀疑单元测试框架(例如NUnit)处理性能测试是否有意义.
我的问题是:我的发现/倾向是否符合社区的想法?
我已经看到了相当一致的意见,实现文件(的.cc /的.cpp)应包括其对应的类定义文件第一个,包括其他头文件之前.但是当主题转移到头文件本身,以及它们包含的包含顺序时,建议似乎有所不同.
Google编码标准建议:
目前尚不清楚上述第1项和第5项之间的差异,以及选择其中一个或另一个地点的原因.也就是说,另一个在线指南建议这个顺序(在该文档的"类布局"部分中找到):
再次出现歧义,这次是第2项和第3项之间的区别.有什么区别?那些代表项目间和项目内部是否包括?
但更重要的是,看起来两个提议的编码标准都建议最后包含"你的"头文件.这些建议与实施文件中包含排序的建议相反,并不直观.将"你的"头文件始终列在第一位 - 在系统和第三方标题之前是否没有意义?
LINQ to SQL或LINQ to Entities已经能够将LINQ转换为SQL文本字符串.但是我希望我的应用程序在不使用db上下文的情况下进行转换 - 这反过来意味着一个活动的数据库连接 - 这两个提供者都需要.
我想将LINQ表达式转换为等效的SQL字符串for WHERE和ORDER BYclauses,而不需要DB上下文依赖项,以使以下存储库接口工作:
public interface IStore<T> where T : class
{
void Add(T item);
void Remove(T item);
void Update(T item);
T FindByID(Guid id);
//sure could use a LINQ to SQL converter!
IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
IEnumerable<T> FindAll();
}
Run Code Online (Sandbox Code Playgroud)
它主要是我感兴趣的表达式树遍历和变换.有没有人知道我可以合并的现有库(nuget?)在这样的自定义上下文中使用?
因为它已经构建了我自己的工作"LINQ转换为SQL文本"工具,类似于这个表达式树到SQL示例,它在我上面的存储库中工作.它允许我编写这样的代码:
IRepository<Person> repo = new PersonRepository();
var maxWeight = 170;
var results = repo.Find(x => (x.Age > 40 || x.Age < 20) && x.Weight < maxWeight); …Run Code Online (Sandbox Code Playgroud) 使用.csproj设置MvcBuildViews和使用Razor Generator实现相同的功能有什么区别?
我自己的假设是,MvcBuildViews不会使单元测试可用的视图智能化,但可能存在其他差异?
根据我是使用基于异步/等待的代码还是基于TPL的代码,我在逻辑清理方面有两种不同的行为CallContext.
CallContext如果我使用以下async/await代码,我可以完全按照我的预期设置和清除逻辑:
class Program
{
static async Task DoSomething()
{
CallContext.LogicalSetData("hello", "world");
await Task.Run(() =>
Debug.WriteLine(new
{
Place = "Task.Run",
Id = Thread.CurrentThread.ManagedThreadId,
Msg = CallContext.LogicalGetData("hello")
}))
.ContinueWith((t) =>
CallContext.FreeNamedDataSlot("hello")
);
return;
}
static void Main(string[] args)
{
DoSomething().Wait();
Debug.WriteLine(new
{
Place = "Main",
Id = Thread.CurrentThread.ManagedThreadId,
Msg = CallContext.LogicalGetData("hello")
});
}
}
Run Code Online (Sandbox Code Playgroud)
以上输出如下:
{Place = Task.Run,Id = 9,Msg = world}
{Place = Main,Id = 8,Msg =}
注意,Msg =这表明CallContext主线程已被释放且为空.
但是,当我切换到纯TPL/TAP代码时,我无法达到同样的效果......
class Program
{ …Run Code Online (Sandbox Code Playgroud) 我正在使用Visual Studio 2008开发版的Profiler.要执行"有针对性的分析",我可以在附加到当前运行的测试代码的任何时候通过"标记"手动设置分析器过滤器.但我想以编程方式插入标记.我想在我的测试代码中添加一个调用,指令或指令,当执行时,它会告诉探查器"这是一个'标记',称为'BeginWork'"和"这是一个'标记',称为'EndWork'".
有没有办法做到这一点?如果没有,Visual Studio 2010是否具备该功能?
创建依赖注入绑定的两种常见机制(例如通过IOC容器)来自XML配置或命令式代码块.在这些情况下,键值对是显式的(即键=请求类型,值=返回类型).
仍然有第三种"启发式"方法,其中应用程序/ IOC容器仅被赋予[IMyClass]键,然后容器反映一组应用程序组件依赖项以查找所有名称匹配的具体类[MyClass].换句话说,发现"返回类型"值而不是声明.
我想知道的是双重的:
从头开始,我用两个项目创建了一个新的解决方案:一个是MVC 3,另一个是支持EF 4.2项目.整个事情成功建立.从MVC项目中,我打开"添加控制器"对话框,让它根据我从支持的EF项目中选择的上下文和模型生成代码."添加控制器"对话框失败,并显示以下消息:
无法检索"MyModelClass"的元数据.配置系统无法初始化.
我注意到"添加控制器"对话框实际上是在尝试从其web.config文件中获取数据库连接字符串.首先,由于支持EF项目已经有一个带有连接字符串的app.config,这让我觉得很愚蠢.但是从来没有意识到,我能想到的最好的是web.config中的连接字符串不知何故.这就是它的样子:
<add name="Monsters2Entities"
connectionString="
metadata=res://*/Monsters.csdl|
res://*/Monsters.ssdl|
res://*/Monsters.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=.;
initial catalog=Monsters2;
integrated security=True;
pooling=False;
multipleactiveresultsets=True;
App=EntityFramework
""
providerName="System.Data.EntityClient"
/>
Run Code Online (Sandbox Code Playgroud)
连接字符串实际上没有所有荒谬的换行符和缩进 - 我只是想让它更容易阅读.无论如何,该连接字符串基本上与在其上建模的支持EF项目中使用的连接字符串相同.如何纠正这种情况,让"添加控制器"拨号开心?
当使用DBContext编写LINQ查询语法表达式时,C#编译器会使用其18个转换/术语重写规则列表将其查询语法转换为点/扩展语法.然后,当执行查询时,EF应用其自己的内部重写规则来生成SQL表达式.
就像我上面链接的文章一样,我想要列出EF正在应用的重写规则.我在哪里可以找到它?如果我知道EF重写规则,我可以预测SQL EF将为给定查询生成什么,而不必等到运行时"看到"生成的SQL.
例如,请考虑以下两个查询:
var result = from c in context.Customers
from a in c.Accounts
where c.ID > 2
select a;
var result = from c in context.Customers
where c.ID > 2
from a in c.Accounts
select a;
Run Code Online (Sandbox Code Playgroud)
当C#编译器完成自己的重写规则时,上述查询将转换为带有以下各种格式的点表示法:
SelectMany(...).Where(...).Select(...); //for the first query
Where(...).SelectMany(...); // for the second query
Run Code Online (Sandbox Code Playgroud)
在这些转换之后,EF开始应用自己的重写规则.但是EF对于上述两个查询都有一个标准化形式.换句话说,两个查询都会产生相同的结果; 任一查询都会生成以下SQL语句:
SELECT
[Extent1].[ID] AS [ID],
[Extent1].[Name] AS [Name],
[Extent1].[Stat_ID] AS [Stat_ID]
FROM [dbo].[Customers] AS [Extent1]
INNER JOIN [dbo].[Accounts] AS [Extent2] ON [Extent1].[ID] = [Extent2].[Customer_ID]
WHERE [Extent2].[ID] > …Run Code Online (Sandbox Code Playgroud) c# ×6
.net ×5
asp.net-mvc ×2
linq ×2
sql ×2
unit-testing ×2
async-await ×1
asynchronous ×1
c++ ×1
coding-style ×1
header-files ×1
include ×1
late-binding ×1
parsing ×1
performance ×1
profiler ×1
profiling ×1
razor ×1
task ×1