【问题标题】:Elegantly appending a set of strings (.txt file) to another set of strings (.txt also)?优雅地将一组字符串(.txt 文件)附加到另一组字符串(.txt 也是)?
【发布时间】:2013-08-02 01:37:46
【问题描述】:

这个请求可能看起来有点荒谬,但不幸的是,它是我的小公司迫切需要的,因此我将奖励最高的奖金以获得良好的解决方案。

我们有一组旧订单信息存储在 .txt 文件中。为了将此订单信息导入我们新的自定义数据库系统,我们需要为每一行附加另一个集合中的值。

所以,在我的 .txt 文件中,我有:

Trans Date,NorthTotal,NorthSoFar,SouthTotal,SouthSoFar,IsNorthWorkingDay,IsSouthWorkingDay
2012-01-01,21,0,21,0,0,0
2012-01-02,21,0,21,0,0,0
2012-01-03,21,1,21,1,1,1
...

现在,我在 .txt 文件中也有一组位置,我需要为此添加两列 - 城市和国家。比方说:

City, Country
London,England
Paris,France

对于我的第一个文本文件中的每一行,我需要在我的第二个文本文件的一行上追加!因此,对于我的最终结果,我希望使用上面的示例数据:

Trans Date,NorthTotal,NorthSoFar,SouthTotal,SouthSoFar,IsNorthWorkingDay,IsSouthWorkingDay,City,Country
2012-01-01,21,0,21,0,0,0,London,England
2012-01-02,21,0,21,0,0,0,London,England
2012-01-03,21,1,21,1,1,1,London,England
2012-01-01,21,0,21,0,0,0,Paris,France
2012-01-02,21,0,21,0,0,0,Paris,France
2012-01-03,21,1,21,1,1,1,Paris,France
...

目前我唯一的想法是将这两个文件导入 SQL 数据库并编写一个复杂的函数将两者附加在一起(因此我的标签) - 当然有人可以拯救我并想到一些不会占用所有内容的东西一天不过!请?!非常感谢。

编辑:我对用所有编程语言编写的解决方案持开放态度;但更喜欢使用 DOS 或某种可以轻松重新运行的控制台/程序的东西!

【问题讨论】:

  • 您能将这两个文件都解释为 CSV 吗?这将使使用 SheetReferenceFunction 构建到 Excel 中轻松合并这些文件。
  • @CSharpie 是的,我确实可以!您能否提供一些有关如何实现的信息?

标签: sql string algorithm text append


【解决方案1】:

这是 C# 中的一个解决方案。你像这样运行它:

joinfiles a.txt b.txt c.txt

其中 a.txt 是第一个文件,b.txt 是第二个文件,c.txt 是要创建的输出文件。它在我的机器上以 100 MB/s 的速度生成输出,所以这可能已经足够快了。

using System;
using System.IO;
using System.Text;

namespace JoinFiles
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length != 3)
                return;

            string[] file1, file2;

            try
            {

                using (var sr1 = new StreamReader(args[0]))
                using (var sr2 = new StreamReader(args[1]))
                {
                    file1 = sr1.ReadToEnd().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
                    file2 = sr2.ReadToEnd().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
                }

                using (var outstream = new StreamWriter(args[2], false, Encoding.Default, 1048576))
                {
                    outstream.WriteLine(file1[0] + "," + file2[0]);

                    for (int i = 1; i < file2.Length; i++)
                        for (int j = 1; j < file1.Length; j++)
                            outstream.WriteLine(file1[j] + "," + file2[i]);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    如果您愿意使用数据库并导入这些文件(这应该不是很困难),那么您不需要“将两者附加在一起的复杂功能”。您只需要这样一个简单的交叉连接...select t1.*, t2.* from t1, t2

    请访问...http://sqlfiddle.com/#!2/0c584/1

    【讨论】:

      【解决方案3】:

      bash 脚本示例

      echo -e 'c1\na\nb' > t1
      echo -e 'c2\n1\n2' > t2
      while read l1;do
        read -u 3 l2
        echo "$l1,$l2"
      done <t1 3<t2
      

      man bash/内部函数/读取

      【讨论】:

        【解决方案4】:

        您也可以编写一个 WSH 脚本来执行此操作并从命令行执行。这是一个快速破解(有效,但肯定需要一些改进)。您需要将其保存为 vbs 文件并像这样在 cli 上执行...wscript script.vbs infile1.txt infile2.txt outfile.txt 其中 script.vbs 是您的脚本,infile 1 和 2 是输入文件名,outfile.txt 是输出文件。

        Set FSO_In1 = CreateObject("Scripting.FileSystemObject")
        Set FSO_In2 = CreateObject("Scripting.FileSystemObject")
        Set FSO_Out = CreateObject("Scripting.FileSystemObject")
        Set File_Out = FSO_In1.CreateTextFile(Wscript.Arguments.Item(2),2)
        Set F1_file = FSO_In1.OpenTextFile(Wscript.Arguments.Item(0),1)
        HeaderWritten = False
        Header = F1_File.Readline 'Read the first header line from first file
        Do While F1_File.AtEndOfStream = False
           F1_Line = F1_file.Readline
           Set F2_File = FSO_In2.OpenTextFile(Wscript.Arguments.Item(1),1)
           if HeaderWritten = False then
               Header = Header & "," & F2_File.Readline
               File_Out.Writeline(Header)
               HeaderWritten = True
           else
               F2_File.Readline 'Read the first header line from second file and ignore it
           end if
           Do While F2_File.AtEndOfStream = False
               F2_Line = F2_File.Readline
               out = F1_Line & "," & F2_Line
               File_Out.Writeline(out)
           Loop
           F2_File.Close
        Loop
        F1_File.Close
        File_Out.Close
        

        【讨论】:

          猜你喜欢
          • 2021-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-12
          • 2017-06-06
          • 1970-01-01
          • 2020-09-12
          • 2017-01-30
          相关资源
          最近更新 更多