0

次の形式のタブ区切りデータを並べ替えたいと思います。

Marketing, Advertising, PR  Graduate, Trainees  Oil, Gas, Alternative Energy    
Marketing, Advertising, PR  Graduate, Trainees  Public Sector & Services    
Marketing, Advertising, PR  Graduate, Trainees  Recruitment Sales   
Marketing, Advertising, PR  Graduate, Trainees  Secretarial, PAs, Administration    
Marketing, Advertising, PR  Graduate, Trainees  Senior Appointments 
Marketing, Advertising, PR  Graduate, Trainees  Telecommunications  
Marketing, Advertising, PR  Graduate, Trainees  Transport, Logistics    
Other   Graduate, Trainees  Banking, Insurance, Finance 
Other   Graduate, Trainees  Customer Services   
Other   Graduate, Trainees  Education   
Other   Graduate, Trainees  Health, Nursing 
Other   Graduate, Trainees  Legal   
Other   Graduate, Trainees  Management Consultancy

単一のフレーズの単語と複数の単語のフレーズが混在しています。フレーズの単語の間にはカンマがあります。フレーズはタブ区切りです。

テキスト セルがアルファベット順にソートされている別のデータ セットと比較する必要があります。

明らかに、これは直接比較を困難 (不可能) にします。

以下のovastusの提案に従って、次のコードがあります

open System;;
open System.IO;;
#load @"BigDataModule.fs";;
open BigDataModule;;

let sample = "TruncatedData.txt";;

let outputFile = "SortedOutput.csv";;


let sortWithinRow (row:string) =
    let columns = row.Split([|'\t'|])
    let sortedColumns = 
        Seq.append
            (columns |> Seq.take (columns.Length) |> Seq.sort)
            [ columns.[columns.Length - 1] ]            
    sortedColumns |> String.concat ",";;

sample |> readLines |>  Seq.map sortWithinRow |> saveTo (outputFile);;

readLines と saveTo は、ファイルを読み込んで出力を保存するための独自のビッグ データ モジュールの関数です。

このスクリプトから出力を取得すると、残念ながら、並べ替えによって目的の結果が得られず、行がまだアルファベット順に並べ替えられていません。

誰かが私のスクリプトをさらに改良するのを手伝ってくれるなら、私はとても感謝しています.

入力の形式を単純化しすぎて問題を過小評価していたため、時間を無駄にしてしまったことをお詫びします。

EDIT 1:データをcsvファイルとして保存したことを明確にし、F#でこれを行います。

編集 2: データ セットの余分な部分をすべて取り除きました。これらの行内で並べ替えるだけです。私が試したいくつかのコードの詳細も示しました。

編集3:

これは私が入力した元のデータ フレームであり、単純化しすぎています。

Alpha   Bravo   Tango   Delta   15.00
Bravo   Delta   Tango       20.30
Delta   Alpha   Tango   6.17   
Charlie Tango   Foxtrot Alpha   19.13
4

3 に答える 3

1

あなたが望むものを正しく理解しているかどうかはわかりませんが、この出力を生成したい場合:

 Alpha Bravo Delta Tango 15.00
 Bravo Delta Tango 20.30
 Alpha Delta Tango 6.17
 Alpha Charlie Foxtrot Tango 19.13

次のように実行できます。

open System

let sample = """Alpha  Bravo Tango Delta    15.00
Bravo  Delta Tango          20.30
Delta  Alpha Tango          6.17
Charlie Tango Foxtrot Alpha 19.13""".Split [|'\n'|]

let sortWithinRow (row:string) =
    let columns = row.Split([|' '|], StringSplitOptions.RemoveEmptyEntries)
    let sortedColumns = 
        Seq.append
            (columns |> Seq.take (columns.Length - 1) |> Seq.sort)
            [ columns.[columns.Length - 1] ]            
    sortedColumns |> String.concat " "

sample |> Seq.map sortWithinRow |> String.concat "\n"
于 2013-02-28T13:52:42.710 に答える
1

以下はどうですか?

sample |> 
  Seq.map (fun x -> x.Split('\t')) |> 
  Seq.map (Seq.map (fun x -> x.Trim())) |> 
  Seq.map (Seq.filter (fun x -> not (String.IsNullOrEmpty(x)))) |>
  Seq.map Seq.sort |> 
  Seq.map (String.concat '\t') |> 
  String.concat '\n';;

例を貼り付ける方法で \t を入力することはできないため、実行可能な例では、フィールド区切り文字をスペースに切り替える必要がありました

open System

let sample2 = """Alpha  Bravo Tango Delta    15.00
Bravo  Delta Tango          20.30
Delta  Alpha Tango          6.17
Charlie Tango Foxtrot Alpha 19.13""".Split [|'\n'|]

sample2 |> 
  Seq.map (fun x -> x.Split([|"  "|], StringSplitOptions.None)) |> 
  Seq.map (Seq.map (fun x -> x.Trim())) |> 
  Seq.map (Seq.filter (fun x -> not (String.IsNullOrEmpty(x)))) |>
  Seq.map Seq.sort |> 
  Seq.map (String.concat '\t') |> 
  String.concat '\n';;
于 2013-03-01T11:24:54.730 に答える
0

F#データを使用してみてください

[<Literal>]
let sample = """Text1,Text2,Text3,Text4,ValueField
Alpha,Bravo,Tango,Delta,15.00
Bravo,Delta,Tango,,20.30
Delta,Alpha,Tango,,6.17
Charlie,Tango,Foxtrot,Alpha,19.13"""

open FSharp.Data

let csv = CsvProvider<sample, Separator = ",">.Load("input.csv")

let sortedData = 
    csv.Data 
    |> Seq.sortBy (fun row -> row.Text1)
    |> Seq.map (fun row -> row.Columns |> String.concat ",")

System.IO.File.WriteAllLines("output.csv", sortedData)

複数のフィールドで並べ替える場合は、並べ替え機能でそれらをタプルすることができます。

|> Seq.sortBy (fun row -> row.Text1, row.Text3)
于 2013-02-28T13:31:50.553 に答える