读取文件以检查是否存在多个字符串

Read a file to check for existence of multiple strings

提问人:User_zyp9 提问时间:11/4/2023 最后编辑:User_zyp9 更新时间:11/4/2023 访问量:42

问:

我是 SAS/Python 人员,我必须为 C# 程序员回填......

我需要对文件进行预处理,然后再将其读入我公司的软件中,以确保它是正确的文件类型。问题是,正确的文件扩展名 (*.prj) 与 GIS 制图中使用的 ESRI SHP 文件共享它。更糟糕的是,我公司开发的软件实际上使用 SHP 文件进行映射。所以,你可以想象,有时人们会让他们感到困惑。

因此,当我读入 *.prj 文件时,我需要确保它不是 SHP prj 文件。拒绝 ESRI SHP *.prj 文件的最简单方法是读取文件的开头,以确定前几个字节是否为以下字节之一:

  1. “地球地球观测系统[”
  2. “PROJCS[”
  3. “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]]

C# LINQ 搜索 布尔 读取行

评论

1赞 Rand Random 11/4/2023
恕我直言,噪音很大

答:

1赞 Rand Random 11/4/2023 #1

尝试使用它

//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

0赞 Mike Bruno 11/4/2023 #2

根据这些文件的大小,我会考虑将内容读入字符串,而不是逐行迭代它们:

static bool IsPrjFile(string inputFile, IEnumerable<string> searchItems)
{
    String contents = File.ReadAllText(inputFile);
    return searchItems.Any(item => contents.IndexOf(item, StringComparison.Ordinal) > -1);
}