提问人:User_zyp9 提问时间:11/4/2023 最后编辑:User_zyp9 更新时间:11/4/2023 访问量:42
读取文件以检查是否存在多个字符串
Read a file to check for existence of multiple strings
问:
我是 SAS/Python 人员,我必须为 C# 程序员回填......
我需要对文件进行预处理,然后再将其读入我公司的软件中,以确保它是正确的文件类型。问题是,正确的文件扩展名 (*.prj) 与 GIS 制图中使用的 ESRI SHP 文件共享它。更糟糕的是,我公司开发的软件实际上使用 SHP 文件进行映射。所以,你可以想象,有时人们会让他们感到困惑。
因此,当我读入 *.prj 文件时,我需要确保它不是 SHP prj 文件。拒绝 ESRI SHP *.prj 文件的最简单方法是读取文件的开头,以确定前几个字节是否为以下字节之一:
- “地球地球观测系统[”
- “PROJCS[”
- “GEOCCS[”
对于我可以访问的文件,#1 似乎是最常见的,但可能还有其他我没有遇到过的文件。这些似乎被称为 WKT 文件,并且可能具有其他前导字节(请参阅此处的坐标系)。
目前,我的软件在加载这些ESRI SHP文件时正确地抛出异常。然而,问题在于该消息含糊不清且笼统。我想添加一些代码,如果选择这些 ESRI SHP 文件之一,则会提醒用户该文件是映射文件,并且不应删除或覆盖它。
我已经成功地编写了一个控制台应用程序来测试这一点,它“有效”,但仅适用于主要的 WKT 类型。我希望能够在必要时添加更多搜索词,更重要的是,我喜欢 linq 代码的简单性。
不过,到目前为止,我还没有找到一种方法来使用相同的方法获得多个搜索词。在这一点上,这对我来说更像是一种学习练习。
我尝试了几种不同的选项,例如使用列表。但是我无法让 linq 将它们与语句一起使用。READLINES
任何帮助将不胜感激。
using System;
using System.Xml;
using System.Linq;
using System.Collections.Generic;
namespace TestPgm
{
public class Check_PRJ
{
// check to see if PRJ file is the correct file
public static void Main()
{
Console.Write("Please enter file name and path:");
string fname = Console.ReadLine();
string prj_flag = "GEOGCS[";
string dir = new FileInfo(fname).DirectoryName.ToString();
if (IsPrjFile(fname, prj_flag) == true)
Console.WriteLine("PRJ file is a component of a GIS SHP file. " +
"It is not a corrupted file--do not delete.");
else
Console.WriteLine("File is the correct PRJ file.");
static bool IsPrjFile(string input, string search)
{
try
{
return File.ReadLines(input).Any(x => x.Contains(search));
}
catch (Exception ex)
{
return false;
Console.WriteLine(ex);
}
}
}
}
}
ESRI SHP prj 文件示例如下所示:
GEOGCS[“GCS_North_American_1983”,DATUM[“D_North_American_1983”,SPHEROID[“GRS_1980”,6378137,298.257222101]],PRIMEM[“格林威治”,0],UNIT[“度”,0.017453292519943295]]
答:
尝试使用它
//instead of string its an IEnumerable of string
static bool IsPrjFile(string input, IEnumerable<string> searchItems)
{
try
{
//check if any entry of "searchItems" does contain in x
return File.ReadLines(input).Any(x => searchItems.Any(y => x.Contains(y)));
}
catch (Exception ex)
{
return false;
Console.WriteLine(ex);
}
}
仅供参考,而不是
string dir = new FileInfo(fname).DirectoryName.ToString();
使用这个
string dir = Path.GetDirectoryName(fname);
https://learn.microsoft.com/en-us/dotnet/api/system.io.path.getdirectoryname?view=net-7.0
根据这些文件的大小,我会考虑将内容读入字符串,而不是逐行迭代它们:
static bool IsPrjFile(string inputFile, IEnumerable<string> searchItems)
{
String contents = File.ReadAllText(inputFile);
return searchItems.Any(item => contents.IndexOf(item, StringComparison.Ordinal) > -1);
}
评论