字符串/文件搜索引擎

时间:2011-03-04 12:46:33

标签: c#

需要一些帮助才能创建文件和字符串搜索引擎。 程序需要让用户输入文件名,然后输入搜索字符串的名称,打印搜索结果文件,存储它然后询问用户是否需要其他选择。 这就是我到目前为止所做的:

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;

public class SwitchTest
{
    private const int tabSize = 4;
    private const string usageText = "Usage: INSERTTABS inputfile.txt outputfile.txt";
    public static void Main(string[] args)
    {

        string userinput;

        Console.WriteLine("Please enter the file to be searched");
        userinput = Console.ReadLine();

        using (StreamReader reader = new StreamReader("test.txt"))
        {
            //Read the file into a stringbuilder
            StringBuilder sb = new StringBuilder();
            sb.Append(reader.ReadToEnd());
            Console.ReadLine();
        }
        {
            StreamWriter writer = null;

            if (args.Length < 2)
            {
                Console.WriteLine(usageText);
                return;
            }

            try
            {
                // Attempt to open output file.
                writer = new StreamWriter(args[1]);
                // Redirect standard output from the console to the output file.
                Console.SetOut(writer);
                // Redirect standard input from the console to the input file.
                Console.SetIn(new StreamReader(args[0]));
            }
            catch (IOException e)
            {
                TextWriter errorWriter = Console.Error;
                errorWriter.WriteLine(e.Message);
                errorWriter.WriteLine(usageText);
                return;
            }

            writer.Close();
            // Recover the standard output stream so that a 
            // completion message can be displayed.
            StreamWriter standardOutput = new StreamWriter(Console.OpenStandardOutput());
            standardOutput.AutoFlush = true;
            Console.SetOut(standardOutput);
            Console.WriteLine("COMPLETE!", args[0]);

            return;


        }
    }
}

我对编程很垃圾,所以用术语xD

保持简单

2 个答案:

答案 0 :(得分:1)

我真的不知道你想要什么,但如果你想在文件中搜索字符串的所有出现,并想要返回位置(行和列),那么这可能会有所帮助:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace CS_TestApp
{
    class Program
    {
        struct Occurrence
        {
            public int Line { get; set; }
            public int Column { get; set; }
            public Occurrence(int line, int column) : this()
            {
                Line = line;
                Column = column;
            }
        }

        private static string[] ReadFileSafe(string fileName)
        {
            // If the file doesn't exist
            if (!File.Exists(fileName))
                return null;

            // Variable that stores all lines from the file
            string[] res;

            // Try reading the entire file
            try { res = File.ReadAllLines(fileName, Encoding.UTF8); }
            catch (IOException) { return null; }
            catch (ArgumentException) { return null; }

            return res;
        }

        private static List<Occurrence> SearchFile(string[] file, string searchString)
        {
            // Create a list to store all occurrences of substring in the file
            List<Occurrence> occ = new List<Occurrence>();

            for (int i = 0; i < file.Length; i++) // Loop through all lines
            {
                string line = file[i]; // Save the line
                int totalIndex = 0; // The total index
                int index = 0; // The relative index (the index found AFTER totalIndex)
                while (true) // Loop until breaks
                {
                    index = line.IndexOf(searchString); // Search for the index
                    if (index >= 0) // If a string was found
                    {
                        // Save the occurrence to our list
                        occ.Add(new Occurrence(i, totalIndex + index));
                        totalIndex += index + searchString.Length; // Add the total index and the searchString
                        line = line.Substring(index + searchString.Length); // Cut of the searched part
                    }
                    else break; // If no more occurances found
                }
            }

            // Here we have our list filled up now we can return it
            return occ;
        }

        private static void PrintFile(string[] file, List<Occurrence> occurences, string searchString)
        {
            IEnumerator<Occurrence> enumerator = occurences.GetEnumerator();
            enumerator.MoveNext();
            for (int i = 0; i < file.Length; i++)
            {
                string line = file[i];
                int cutOff = 0;
                do
                {
                    if (enumerator.Current.Line == i)
                    {
                        Console.Write(line.Substring(0, enumerator.Current.Column - cutOff));
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.Write(searchString);
                        Console.ResetColor();
                        line = line.Substring(enumerator.Current.Column + searchString.Length - cutOff);
                        cutOff = enumerator.Current.Column + searchString.Length;
                    }
                    else break;
                }
                while (enumerator.MoveNext());
                Console.WriteLine(line); // Write the rest
            }
        }

        private static bool WriteToFile(string file, List<Occurrence> occ)
        {
            StreamWriter sw;
            try { sw = new StreamWriter(file); }
            catch (IOException) { return false; }
            catch (ArgumentException) { return false; }

            try
            {
                foreach (Occurrence o in occ)
                {
                    // Write all occurences
                    sw.WriteLine("(" + (o.Line + 1).ToString() + "; " + (o.Column + 1).ToString() + ")");
                }

                return true;
            }
            finally
            {
                sw.Close();
                sw.Dispose();
            }
        }

        static void Main(string[] args)
        {
            bool anotherFile = true;
            while (anotherFile)
            {
                Console.Write("Please write the filename of the file you want to search: ");
                string file = Console.ReadLine();
                Console.Write("Please enter the string to search for: ");
                string searchString = Console.ReadLine();

                string[] res = ReadFileSafe(file); // Call our search method
                if (res == null) // If it either couldn't open the file, or the file didn't exist
                    Console.WriteLine("Couldn't open the read file.");
                else // If the file was opened
                {
                    Console.WriteLine();
                    Console.WriteLine("File:");
                    Console.WriteLine();

                    List<Occurrence> occ = SearchFile(res, searchString); // Search the file
                    PrintFile(res, occ, searchString); // Print the result

                    Console.WriteLine();

                    Console.Write("Please enter the file you want to write the output to: ");
                    file = Console.ReadLine();
                    if (!WriteToFile(file, occ))
                        Console.WriteLine("Couldn't write output.");
                    else
                        Console.WriteLine("Output written to: " + file);

                    Console.WriteLine();
                }

                Pause("continue");

            requestAgain:
                Console.Clear();
                Console.Write("Do you want to search another file (Y/N): ");
                ConsoleKeyInfo input = Console.ReadKey(false);
                char c = input.KeyChar;

                if(c != 'y' && c != 'Y' && c != 'n' && c != 'N')
                    goto requestAgain;

                anotherFile = (c == 'y' || c == 'Y');
                if(anotherFile)
                    Console.Clear();
            }
        }

        private static void Pause(string action)
        {
            Console.Write("Press any key to " + action + "...");
            Console.ReadKey(true);
        }
    }
}

答案 1 :(得分:0)

嗯,实际上我还没理解你在问什么。您是否尝试将某些文本搜索到指定的文件中,然后写出文本的位置?

如果是,请尝试查看:

while (true)
{
    Console.Write("Path: ");
    string path = Console.ReadLine();
    Console.Write("Text to search: ");
    string search = Console.ReadLine();
    if (string.IsNullOrWhiteSpace(path) || string.IsNullOrWhiteSpace(search))
    {
        break;
    }
    if (!File.Exists(path))
    {
        Console.WriteLine("File doesn't exists!");
        continue;
    }

    int index = File.ReadAllText(path).IndexOf(search);
    string output = String.Format("Searched Text Position: {0}", index == -1 ? "Not found!" : index.ToString());
    File.WriteAllText("output.txt", output);

    Console.WriteLine("Finished! Press enter to continue...");
    Console.ReadLine();
    Console.Clear();
}