【问题标题】:substring extract C# problem子字符串提取C#问题
【发布时间】:2009-09-05 15:06:51
【问题描述】:

我有这样的文字......

======== 1079.tif
Image Description               : Vexcel-UCD-Level-3
------------------
CAM_ID:                  UCD-SU-1-0018 [5]
RECORD_GUID:             64763E99-3573-43AD-995B-8A07E3FE2BE3
IMG_NO:                  1079
CAPTURE_TIME:            2004/03/15 02:07:17.641
IMG_TYPE:                High resolution multi channel RGBI
ROTATION:                0 [degrees]
--- Inner Orientation ---------------
PRINCIPLE_DISTANCE:      101.400 [mm]
PRINCIPLE_POINT_X:         0.000 [mm]
PRINCIPLE_POINT_Y:         0.180 [mm]
PIXEL_SIZE_WIDTH:          9.000 [microns]
PIXEL_SIZE_HEIGTH:         9.000 [microns]
SENSOR_AREA_WIDTH:       103.500 [mm]
SENSOR_AREA_HEIGHT:       67.500 [mm]
-------------------------------------
--- Custom Meta Data ----------------
FMS No:                   1079
Date:                     070912

Time:                     122005
Project:                  QOM
Area:                     QANAVAT
Line No:                  11
Segment No:               1
Waypoint No:              17
WGS84 Latitude:           N34.559857
WGS84 Longitude:          E050.760726
WGS84 Altitude [m]:       1719.1
Pos Solution:             GPS
Track [degree]:           271
Midpulse correction [s]:  0.00086
-------------------------------------

======== 1080vv.TIF
Image Description               : Vexcel-UCD-Level-3
------------------
CAM_ID:                  UCD-SU-1-0018 [5]
RECORD_GUID:             64763E99-3573-43AD-995B-8A07E3FE2BE3
IMG_NO:                  1080
CAPTURE_TIME:            2004/03/15 02:07:19.974
IMG_TYPE:                High resolution multi channel RGBI
ROTATION:                0 [degrees]
--- Inner Orientation ---------------
PRINCIPLE_DISTANCE:      101.400 [mm]
PRINCIPLE_POINT_X:         0.000 [mm]
PRINCIPLE_POINT_Y:         0.180 [mm]
PIXEL_SIZE_WIDTH:          9.000 [microns]
PIXEL_SIZE_HEIGTH:         9.000 [microns]
SENSOR_AREA_WIDTH:       103.500 [mm]
SENSOR_AREA_HEIGHT:       67.500 [mm]
-------------------------------------
--- Custom Meta Data ----------------
FMS No:                   1080
Date:                     070912
Time:                     122008
Project:                  QOM
Area:                     QANAVAT
Line No:                  11
Segment No:               1
Waypoint No:              16
WGS84 Latitude:           N34.559901
WGS84 Longitude:          E050.758750
WGS84 Altitude [m]:       1717.9
Pos Solution:             GPS
Track [degree]:           272
Midpulse correction [s]:  0.00086
-------------------------------------

如您所见,它有一个重复信息的循环

我需要编写一个 C# 程序来从我的 txt 文件中提取所有这些类型的子字符串

"1080"
"Longitude:   E050.758750."
"Latitude :     N34.559901."
[m]: 1717.9"

有没有人可以帮我解决这个问题???

谢谢

【问题讨论】:

  • 你想用这个做什么?你对格式有什么了解吗?
  • 非常感谢,让我多解释一下……这些信息是从航空图片中提取的,将用于几何问题 这些是这些图片的元数据信息,已经用一些程序提取就像“exiftool”一样,并且已经保存到一个文本文件中,因为一个不需要的异常我必须重新检查每张图片的坐标,以便在 orderr 中找到它在网格中的真实位置......而且我在 C# 中不是非常少数编程,但我需要帮助来解决这个问题,所有信息都将被提取到 onr txt 文件中,谢谢 - 5 分钟前的居民

标签: c# extract substring


【解决方案1】:

那些“..”部分可能是在翻译中丢失的 CR、LF 行结尾。

显而易见的答案是使用正则表达式 (RegEx),但您可能需要通过恢复行并仅从某些行中提取内容来进行一些预处理。我认为这是您的结果组来自 1 个“行”的条件。尤其是“1080”值很容易错配。

当您需要正则表达式帮助时回复。


在 Lasse 出色的编辑之后,问题变得更加清晰。

通过查看数据,我会说您实际上并不需要 RegEx,但您可以一次处理 1 行数据并使用 line.StartsWith(...) 对它们进行分类。当您找到StartsWith("====") 的行时,您喜欢“记录”的结尾+开头。

【讨论】:

    【解决方案2】:

    正则表达式可能是一个很好的方法,但由于我不擅长它,试试这个: 我假设这就是你想要的。

        public ObjectOfMyFile ParseFile(string fileContent)
        {
            ObjectOfMyFile objectOfMyFile = new ObjectOfMyFile();
            string[] contentLines = fileContent.Split(new[] { Environment.NewLine },
                                                      StringSplitOptions.RemoveEmptyEntries);
    
            for (int i = 0; i < contentLines.Length; i++)
            {
                string contentLine = contentLines[i];
    
                if (contentLine.StartsWith("FMS No", StringComparison.OrdinalIgnoreCase))
                {
                    string[] fmsNo = SplitByColon(contentLine);
                    if (fmsNo.Length == 2)
                    {
                        objectOfMyFile.Longitudes.Add(fmsNo[1].Trim());
                    }
    
                    continue;
                }
    
                if (contentLine.IndexOf("WGS84 Longitude", StringComparison.OrdinalIgnoreCase) > -1)
                {
                    string[] longitudeKeyValue = SplitByColon(contentLine);
                    if (longitudeKeyValue.Length == 2)
                    {
                        objectOfMyFile.Longitudes.Add(longitudeKeyValue[1].Trim());
                    }
    
                    continue;
                }
            }
    
            return objectOfMyFile;
        }
    
        public string[] SplitByColon(string valueToSplit)
        {
            return valueToSplit.Split(new[] { ":" }, StringSplitOptions.RemoveEmptyEntries);
        }
    
        public class ObjectOfMyFile
        {
            public ObjectOfMyFile()
            {
                Longitudes = new List<string>();
                FmsNos = new List<string>();
            }
            public List<string> Longitudes { get; private set; }
            public List<string> FmsNos { get; private set; }
            // Etc...
        }
    }
    

    为了检查数组中是否存在第二个值,存在一些代码重复,但您可以让自己变得更好

    【讨论】:

    • 非常感谢 jeroen,但我有点困惑,我无法理解代码到底你介意请多解释一下......我怎么能从中得到输出,我有点新 C#编程我使用了某种类似的东西;但它只能从第一行提取信息
    • 我编写了某种程序: 1-使用“打开文件对话框”打开 txt 文件 2-使用两个字符串之间的方法子字符串 s 我为第一行提取字符串 3-将其显示在文本框 4-并使用 savefiledialog 将其保存到另一个 txt 文件中,但这不是我想要的,我需要提取所有这些信息,这些信息在文本文件中反复循环,我不知道,所以我不得不问你跨度>
    • 您是否尝试过读取文件并将内容传递给此方法。使用调试器,您应该能够弄清楚我认为发生了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多